سؤال

هل يمكن لأحد أن يخبرني لماذا يعمل برنامجي غريب. أحاول الفرز 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)

وسوف يوفر لك القليل من الوقت.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top