首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python中集合的迭代顺序

Python中集合的迭代顺序
EN

Stack Overflow用户
提问于 2010-08-04 22:08:16
回答 4查看 2.5K关注 0票数 17

如果我有两个相同的集合,这意味着a == b给了我True,它们会有相同的迭代顺序吗?我试过了,它起作用了:

代码语言:javascript
复制
>>> foo = set("abc")
>>> bar = set("abc")
>>> zip(foo, bar)
[('a', 'a'), ('c', 'c'), ('b', 'b')]

我的问题是,我是幸运的,还是这行为是有保证的?

EN

回答 4

Stack Overflow用户

发布于 2010-08-04 22:10:37

你很幸运,订单不能保证。唯一可以保证的是集合将具有相同的元素。

如果您需要某种可预测性,您可以像这样对它们进行排序:zip(sorted(foo), sorted(bar))

票数 4
EN

Stack Overflow用户

发布于 2010-08-04 22:15:08

编号:

代码语言:javascript
复制
>>> 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__。我刚试了一些我认为会打破这个的东西,它做到了。

票数 4
EN

Stack Overflow用户

发布于 2010-08-04 22:32:07

是的,你很幸运。例如,请参阅:

代码语言:javascript
复制
import random
r = [random.randint(1,10000) for i in range(20)]
foo = set(r)
r.sort(key=lambda _: random.randint(1,10000))
bar = set(r)
print foo==bar
print zip(foo, bar)

这给了我一个结果:

代码语言:javascript
复制
True
[(3234, 3234), (9393, 9393), (9361, 1097), (1097, 5994), (5994, 2044), (1614, 1614), (6074, 4377), (4377, 9361), (5202, 5202), (2355, 2355), (1012, 1012), (7349, 7349), (6198, 6198), (8489, 8489), (7929, 7929), (6556, 6074), (6971, 6971), (2044, 6556), (7133, 7133), (383, 383)]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3406341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档