إخراج خاطئ في بيثون - حسب منطقتي
سؤال
هل يمكن لأحد أن يخبرني لماذا يعمل برنامجي غريب. أحاول الفرز list1
في ترتيب تصاعدي. هذا الرمز هو جزء من برنامج SURT السريع الذي أحاول كتابته. وفقًا لمنطقي الذي أقوم بتطبيقه في هذا الرمز ، وقد راجعت يدويًا أيضًا ، يجب أن يكون الإخراج [1،2،3،4،5]. ومع ذلك ، فإن الناتج يخرج ليكون [1،2،2،4،5]. هل يمكنك معرفة ما الذي يحدث؟
list1=[3,2,1,5,4]
n_list1=len(list1)
count=0
for position1, item1 in enumerate(list1[0:n_list1]):
temp=item1
count=count+1
for position2 in range(count,n_list1):
if list1[position1]>list1[position2]:
list1[position1]=list1[position2]
list1[position2]=temp
temp=list1[position1]
print list1
تعديل: ما أحاول فعله هو مثل هذا:
أبدأ بمقارنة العنصر الأول مع العناصر التالية (N-1) وأتبادل أصغر عنصر مع العنصر الأول. الآن أذهب إلى العنصر الثاني وأقارنه بالعناصر التالية (N-2) وأتبادل مع أصغر عنصر بين العناصر (N-2). مثل هذا أتقدم إلى الأمام.
ملحوظة: هذا جزء من برنامج Quicksort الخاص بي وهو ليس في حد ذاته سريعًا. هذا الجزء ل list1
التي أعين أرقام أقل من المحور. رمز آخر سيكون ل list2
حيث سأقوم بتعيين أرقام أكبر من المحور.
المحلول
الإجابة التي توفرها RBP صحيحة تمامًا!
أيضًا ، أعتقد أنه يمكنك تبسيط ما ورد أعلاه عن طريق إزالة العد نفسه ، وكذلك تعداد القائمة مباشرة واستخدام Python المصطلح - A ، B = B ، A لتبديل القيم
list1=[3,2,1,6,5,4]
n_list1 = len(list1)
for position1, item1 in enumerate(list1):
for position2 in range(position1,n_list1):
if list1[position1]>list1[position2]:
list1[position1] , list1[position2] = list1[position2], list1[position1]
print list1
انتاج:
[1, 2, 3, 4, 5, 6]
تحرير: حول المصطلح
>>> a = 4
>>> b = 5
>>> a , b = b, a
>>> a
5
>>> b
4
>>> c = 5
>>> d = 6
>>> t = c
>>> c = d
>>> d = t
>>> c
6
>>> d
5
>>>
نصائح أخرى
منذ أن تفعل count = count + 1
مباشرة قبل الأعمق for
, ، لا يمكنك الوصول إلى المركز الأول من List1 (list1[0]
) ، وهو عنصر "3".
تحرير] النظر بعناية أكبر في الكود الخاص بك ، يبدو أن هناك الكثير من الالتباس. على سبيل المثال ، على
list1[position1]=list1[position2]
list1[position2]=temp
temp=list1[position1]
أنت تخسر قائمة 1 [position1]: أنت تحملها فوق القائمة [position2] ، قبل محاولة حفظها في متغير Temp. حاول التحرك temp=list1[position1]
إلى السطر الأول بعد if
.
وبصراحة ، فإن تنفيذك معقد للغاية. أقترح عليك أن تحاول كتابتها في رمز زائفة ، وتحاول فهم ما يجري فعليًا ، ثم إعادة تنفيذها.
تحسن بسيط في الإجابة الصحيحة لـ Pyfunc ... هذا الخط
for position2 in range(position1,n_list1)
يمكن ان يكون
for position2 in range(position1+1,n_list1)
وسوف يوفر لك القليل من الوقت.