在Python中访问frozenset中的项目

3

我有一个frozenset,如下:x = frozenset({"a":1,"b":2})。我无法找到一种方法来访问字典中的项。是否有一种方法可以解冻frozenset?以下是我得到的错误信息:

In [1]: x = frozenset({"a":1,"b":2})

In [2]: x
Out[2]: frozenset({'a', 'b'})

In [3]: x["a"]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-c47cedd3f38d> in <module>()
----> 1 x["a"]

TypeError: 'frozenset' object has no attribute '__getitem__'

非常感谢您的帮助。


4
Frozenset 是一个集合,而不是字典。 - Ashwini Chaudhary
1
frozenset 构造函数接受一个可迭代对象,就像 set 构造函数一样。当你迭代一个 dict 时,你迭代的是它的 。不过,我不确定为什么你期望在一个集合上使用 x['a'] 的方式可以工作。这是字典的行为。 - juanpa.arrivillaga
有没有办法“解冻”它,并访问其中的字典? - lordlabakdas
4
@lordlabakdas:里面没有字典! - user2390182
1
问题不在于冻结,而是在于集合。正如Ashwini所说,集合不是字典。使用标准的set()也会遇到同样的问题。 - Daniel Roseman
2个回答

5

frozenset 构造函数接受一个可迭代对象!正如评论中提到的,当你迭代一个 dict 时,你只会迭代它的键,因此值会丢失。

x = frozenset({"a": 1,"b": 2})
# frozenset(['a', 'b'])

你可以通过字典的元素来创建它:
x = frozenset({"a": 1, "b": 2}.items())
# frozenset([('a', 1), ('b', 2)])

现在,您可以将其简单地转换回一个dict:
d = dict(x)
# {'a': 1, 'b': 2}

1

访问元素的另一种方式是通过列表访问,因此可以按照@user2390182创建的方式创建一个冻结集合:

x = frozenset({"a": 1,"b": 2}.items())

然后可以通过以下方式创建列表:

d = list(x)
# [('a',1),('b',2)]

通过列表转换,我们也可以迭代单个元素的不可变集合,所以:

x2 = frozenset({"a","b"})

转换如下所示:

d2 = list(x2)
# ['a','b']

但是将单个元素的冻结集转换为字典会失败:

d2 = dict(x2)
# ValueError: dictionary update sequence element #0 has length 1; 2 is required

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接