list(frozenset()) 返回的元素顺序是如何确定的?
How is the order of elements returned by list(frozenset()) determined?
我在 Python 中有以下示例设置:
a = list(frozenset(['haha', 'lol']))
b = list(frozenset(['lol', 'haha']))
有
a == b
总是return正确?
有没有可能相同元素的frozenset的list可以return False 上面的设置?
(冻结)集之间的等价语义是,如果它们包含等价项,则它们是等价的。套装没有顺序。
但是,由于列表 具有 顺序,转换为列表可能会导致它们不等价(取决于(冻结)集的迭代顺序 - 这是实施细节)。
这是内部实现中的一个冲突示例,由于插入顺序(这是在 CPython 实现中)导致不同的迭代顺序:
>>> a = list(frozenset([1, 9]))
>>> b = list(frozenset([9, 1]))
>>> a == b
False
字符串示例:
首先我们要找到碰撞(我就不细说了):
>>> 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!
现在我们需要以不同的顺序添加到集合中以引起重新散列(同样,不详述):
>>> s1, s2 = '2', '7'
>>> a = list(frozenset([s1, s2]))
>>> b = list(frozenset([s2, s1]))
>>> a == b
False
我在 Python 中有以下示例设置:
a = list(frozenset(['haha', 'lol']))
b = list(frozenset(['lol', 'haha']))
有
a == b
总是return正确?
有没有可能相同元素的frozenset的list可以return False 上面的设置?
(冻结)集之间的等价语义是,如果它们包含等价项,则它们是等价的。套装没有顺序。
但是,由于列表 具有 顺序,转换为列表可能会导致它们不等价(取决于(冻结)集的迭代顺序 - 这是实施细节)。
这是内部实现中的一个冲突示例,由于插入顺序(这是在 CPython 实现中)导致不同的迭代顺序:
>>> a = list(frozenset([1, 9]))
>>> b = list(frozenset([9, 1]))
>>> a == b
False
字符串示例:
首先我们要找到碰撞(我就不细说了):
>>> 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!
现在我们需要以不同的顺序添加到集合中以引起重新散列(同样,不详述):
>>> s1, s2 = '2', '7'
>>> a = list(frozenset([s1, s2]))
>>> b = list(frozenset([s2, s1]))
>>> a == b
False