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

时间:2018-07-29 07:49:00

标签: python list set frozenset

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

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<img alt="no data" th:src="@{D:\images\1r-product-6.jpg}">
</body>
</html>

a = list(frozenset(['haha', 'lol'])) b = list(frozenset(['lol', 'haha']))

总是返回 True 吗?

相同设置的 frozenset list 是否可以通过上述设置返回 False

1 个答案:

答案 0 :(得分:2)

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

但是,由于列表具有顺序,因此对列表的强制转换有可能导致它们不相等(取决于(冻结)集合上的迭代顺序-这是实现的详细信息)。

以下是内部实现中发生冲突的示例,该冲突由于插入顺序(这在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