首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何确定list(frozenset())返回的元素的顺序?

如何确定list(frozenset())返回的元素的顺序?
EN

Stack Overflow用户
提问于 2018-07-29 07:49:00
回答 1查看 707关注 0票数 0

我在Python中有以下示例性设置:

代码语言:javascript
复制
a = list(frozenset(['haha', 'lol']))
b = list(frozenset(['lol', 'haha']))

有吗?

a == b

总是还真吗?

相同元素的冻结列表是否有可能在上面的设置中返回False?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-29 07:55:48

(冻结)集之间的等价语义是,如果它们包含等效项,则它们是等效的。集合没有秩序。

但是,由于list 顺序,所以强制转换到列表可能会导致它们不等价(取决于(冻结的)集合的迭代顺序--这是实现细节)。

下面是内部实现中由于安装顺序(在CPython实现中)而导致不同迭代顺序的冲突的一个示例:

代码语言:javascript
复制
>>> a = list(frozenset([1, 9]))
>>> b = list(frozenset([9, 1]))
>>> a == b
False

使用字符串的示例:

首先,我们需要找出一次碰撞(我不会详细说明):

代码语言:javascript
复制
>>> hash('1') % 8
0
>>> hash('2') % 8
5
>>> hash('3') % 8
2
>>> hash('4') % 8
3
>>> hash('5') % 8
1
>>> hash('6') % 8
4
>>> hash('7') % 8 
5  # same as '2' ! Found!

现在,我们需要按不同的顺序添加到集合中,以导致重散列(同样,不详细说明):

代码语言:javascript
复制
>>> s1, s2 = '2', '7'
>>> a = list(frozenset([s1, s2]))
>>> b = list(frozenset([s2, s1]))
>>> a == b
False
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51578335

复制
相关文章

相似问题

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