for/in循环结构是否保留顺序?

Ton*_*nis 16 python

普通的for/in语句是否保证列表按顺序迭代?

my_list = [5,4,3,2]
for i in my_list
    print(i)
Run Code Online (Sandbox Code Playgroud)

也就是说,上面的循环是否保证5 4 3 2每次打印?

use*_*ica 36

一个for循环的迭代顺序由任何物体它的迭代控制.迭代有序集合就像list保证迭代列表顺序中的元素一样,但迭代无序集合就像set几乎没有订单保证.

  • @Germanunkol:我认为应该保证迭代两次而不更改集合总是产生相同的顺序。我知道即使在字典成为保留顺序之前,也对字典有这样的保证,但我不确定他们是否在文档中的任何地方为集合提供了明确的保证。 (3认同)

小智 6

对于列表来说,是的,因为它们是 Python 中的有序数据结构。


Pru*_*une 5

当您遍历序列(列表,元组等)时,将保证顺序。散列结构(字典,集合等)具有自己的顺序-但是对于给定的结构,每次的顺序都相同。如果添加或删除元素,则顺序可能会有所不同。


考虑下面的代码:我制作了一组五个元素,然后使用四个相同的for循环将其打印出来。顺序是一样的。然后添加两个元素;这打乱了订单。

my_set = set(["Apple", "Banana", "Casaba", "Dinner", "Eggplant"])

for food in my_set:
    print food,
print "\n"

for food in my_set:
    print food,
print "\n"

for food in my_set:
    print food,
print "\n"

for food in my_set:
    print food,
print "\n"

my_set.add("Fruitcacke")
my_set.add("Grape")

for food in my_set:
    print food,
print "\n"
Run Code Online (Sandbox Code Playgroud)

输出:

Casaba Dinner Apple Eggplant Banana 

Casaba Dinner Apple Eggplant Banana 

Casaba Dinner Apple Eggplant Banana 

Casaba Dinner Apple Eggplant Banana 

Casaba Fruitcacke Grape Apple Dinner Eggplant Banana 
Run Code Online (Sandbox Code Playgroud)

请注意,原始元素不再具有相同的顺序:“晚餐”现在位于“苹果”之后。

  • “每次”值得详细阐述。在Python程序的一次运行中,对一个dict或set进行两次迭代而不更改它会产生相同的顺序,但是在程序的两次不同运行中对“相同” dict或set进行迭代可能会产生两个不同的顺序。 (2认同)
  • @syntonym:我不确定集合,但实际上可以保证字典。[docs](https://docs.python.org/3/library/stdtypes.html#dictionary-view-objects) 给出了`zip(d.values(), d.keys())` 获胜的例子不要打乱键值关联。 (2认同)