Python中集合的迭代顺序

18 投票
5 回答
3293 浏览
提问于 2025-04-16 02:18

如果我有两个完全相同的集合,也就是说 a == b 的结果是 True,那么它们的遍历顺序会一样吗?我试过了,结果是一样的:

>>> foo = set("abc")
>>> bar = set("abc")
>>> zip(foo, bar)
[('a', 'a'), ('c', 'c'), ('b', 'b')]

我想问的是,这是不是我运气好,还是说这种行为是有保证的?

5 个回答

4

你运气不错,顺序是没有保证的。唯一可以保证的是这两个集合里的元素是一样的。

如果你想要一些可预测的结果,可以这样排序:zip(sorted(foo), sorted(bar))

4

不:

>>> class MyStr( str ):
...     def __hash__( self ):
...             return 0
...
>>> a = MyStr( "a" )
>>> b = MyStr( "b" )
>>> c = MyStr( "c" )
>>> foo = { a, b, c }
>>> foo
{'c', 'b', 'a'}
>>> bar = { b, a, c }
>>> foo is bar
False
>>> foo ==  bar
True
>>> list( zip( foo, bar ) )
[('c', 'c'), ('b', 'a'), ('a', 'b')]

附言:我不知道这个 __hash__ 的重写是否真的有必要。我只是试了一个我觉得会导致问题的做法,结果确实出现了问题。

22

他们的结果一样并不是偶然的:因为这个实现是确定性的,所以两次创建相同的集合会得到相同的顺序。但在Python中,这并没有得到保证。

如果你用两种不同的方法创建相同的集合:

n = set("abc")
print n

m = set("kabc")
m.remove("k")
print m

...你可能会得到不同的顺序:

set(['a', 'c', 'b'])
set(['a', 'b', 'c'])

撰写回答