如何在Python中创建一组集?


126

我正在尝试在Python中设置一组。我不知道该怎么做。

从空集开始xx

xx = set([])
# Now we have some other set, for example
elements = set([2,3,4])
xx.add(elements)

但我明白了

TypeError: unhashable type: 'list'

要么

TypeError: unhashable type: 'set'

Python中可能有一组集合吗?

我正在处理大量集合,但我希望不必处理重复的集合(集合A1,集合A2,....的集合B,如果Ai = Aj,则“将取消”两个集合)

Answers:


120

Python的抱怨是因为内部set对象是可变的,因此不可散列。解决方案是frozenset用于内部集,以表明您无意修改它们。


59

人们已经提到您可以使用Frozenset()做到这一点,所以我将添加一个代码来实现此目的:

例如,您要从以下列表列表中创建一组集合:

t = [[], [1, 2], [5], [1, 2, 5], [1, 2, 3, 4], [1, 2, 3, 6]]

您可以通过以下方式创建集合:

t1 = set(frozenset(i) for i in t)

9
或者您可以使用地图!set(map(frozenset, t))
马特·道奇

18

frozenset在内部使用。


9
自从他是新手以来,也许您可​​以提供一些有关Python中可变/不可变对象的指示?
塞斯·约翰逊

2
@Seth:我可以,但是可变性不是一个因素。
伊格纳西奥·巴斯克斯

非常感谢!刚刚阅读re:可变性。似乎也可以使用一组列表,但是Frozenset似乎可以完成它。再次感谢!
马特

@Ignacio我认为集合中的成员和字典中的键必须是可哈希的,因此是不变的。
塞斯·约翰逊

7
哈希性和可变性不一定是互斥的。碰巧大多数基本的Python类型都共享一个模式。
伊格纳西奥·巴斯克斯

3

所以我有完全相同的问题。我想制作一个可以作为一组集合使用的数据结构。问题在于集合必须包含不可变的对象。因此,您可以做的只是将其作为一组元组。对我来说很好!

A = set()
A.add( (2,3,4) )##adds the element
A.add( (2,3,4) )##does not add the same element
A.add( (2,3,5) )##adds the element, because it is different!

22
在元组中,元素顺序很重要。因此A.add( (4,3,2)); A.add((2,4,3)); A.add((2,3,4))将增加三个不同的元素,而原来的问题是关于“集合的集合”,这意味着(2,3,4)(4,3,2)(2,4,3)是相同的。
鲍里斯·哥列里克

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.