选择排序的for循环传递中的问题

时间:2020-05-23 05:11:59

标签: python sorting for-loop selection-sort

我正在尝试以自己的方式实现选择排序。我正在以一种排序方式获得“ sorted_list”。但是,我无法弄清楚为什么在发现苏黎世是最高元素之后,下一个for loop通行证却跳过了开普敦。在所有找到下一个最高元素的实例中都是如此。在所有这些实例中,for循环中的下一步将跳过该最高元素旁边的元素。

names=['Newyork', 'London', 'Tokyo','Manila','New-Delhi',
       'Osaka','Munich','Berlin','Newcastle', 'Turin','Moscow','Sydney',
       'Zurich','Capetown']
sorted_list=[]

while names:

    for name in names:
     print(name)
     element_index = names.index(name)
     index=0
     while index<len(names):

      if name > names[index] or name == names[index]:
         print(index)
         index += 1

         if index == len(names):
             names.pop(element_index)
             sorted_list.append(name)

             break
      if name < names[index]:
       break

输出:

Newyork
0
1
London
Tokyo
0
1
2
3
4
5
6
7
8
Manila
New-Delhi
Osaka
0
1
Munich
Berlin
Newcastle
Turin
0
1
2
3
4
5
6
7
8
9
10
11
Moscow
Sydney
0
1
Zurich
0
1
2
3
4
5
6
7
8
9
10
11
12
13
Newyork
0
1
London
Tokyo
0
1
2
3
4
5
6
7
8
Manila
New-Delhi
Osaka
0
1
Munich
Berlin
Newcastle
Turin
0
1
2
3
4
5
6
7
8
9
10
11
12
Sydney
0
1
Capetown
Newyork
0
1
London
Tokyo
0
1
2
3
4
5
6
7
8
9
10
11
New-Delhi
Osaka
0
1
2
3
4
5
6
7
8
Munich
Berlin
Newcastle
Moscow
Sydney
0
1
2
3
4
5
6
7
8
9
10
Newyork
0
1
2
3
London
Manila
New-Delhi
Osaka
0
1
2
3
4
5
6
7
8
9
Berlin
Newcastle
Moscow
Capetown
Newyork
0
1
2
3
4
5
6
7
8
Manila
0
1
New-Delhi
0
1
2
3
4
Munich
0
1
Berlin
Newcastle
0
1
2
3
4
5
6
7
Capetown
London
0
Manila
0
1
New-Delhi
0
1
2
3
4
5
6
Berlin
Moscow
0
1
Capetown
London
0
Manila
0
1
Munich
0
1
2
3
4
5
Moscow
0
1
2
3
4
London
0
Manila
0
1
2
3
Capetown
London
0
1
2
Capetown
0
1
Berlin
0

2 个答案:

答案 0 :(得分:0)

我认为此片段应解释发生的情况。

>>> L = [1, 2, 3, 4, 5]
>>> for i, elem in enumerate(L):
...     L.pop(i)
...
1
3
5

当您将.pop()中的"Zurich" names "Capetown"移到"Zurich"的位置,并且您进行循环时,请尝试转到下一个元素这个"Capetown"

在迭代list时修改它是不安全的。

答案 1 :(得分:0)

我同意@ V.Ayrat尝试此操作可能会解决您的目的

 names=['Newyork', 'London', 'Tokyo','Manila','New-Delhi', 'Osaka','Munich','Berlin','Newcastle', 
               'Turin','Moscow','Sydney', 'Zurich','Capetown'] 
        # sorted_list=[]
        for i in range(len(names)): 
            min_idx = i 
            for j in range(i+1, len(names)): 
                if names[min_idx] > names[j]: 
                    min_idx = j 

            names[i], names[min_idx] = names[min_idx], names[i]