看来,当我想从列表中删除某个项目时,该订单会被洗牌。我目前有以下代码:
todo = []
for case in cases:
todo.append(case)
for case in todo:
print(case[1]) #first print
while(len(todo) > 0):
for case in todo:
subject = case[1]
print("Case: " + str(subject)) #second print
todo.remove(case)
这给出了以下结果(第一次打印):
55566
66977
66977
136566
136566
37493
37493
37493
63126
37289
然后是第二次打印(以不同的顺序):
Case: 55566
Case: 66977
Case: 136566
Case: 37493
Case: 63126
Case: 66977
Case: 37493
Case: 37289
Case: 136566
Case: 37493
删除是否意味着排序?如果是这样,如何维持秩序?
答案 0 :(得分:4)
.remove()
肯定不会对您的列表进行排序。相反,您只是通过删除其中的元素来破坏列表上的迭代。基本上,当您在迭代期间从case
移除todo
时,case
中的所有剩余todo
都会在列表中向下滑动一个位置。然后你的迭代错过了一个索引,你会得到不希望的结果。要学习的教训是不要在迭代时从列表中删除元素。另一种选择可以是列表理解,或going backwards。
通过看到这两个循环是等价的,第二个只是一个较低级别的表示,可以更容易地理解这种不受欢迎的行为
cases = [1,2,3]
for case in cases:
print(case)
cases.remove(case)
i = 0
while i < len(cases):
x = cases[i]
print(x)
cases.remove(x)
i+=1