如果我有套装清单:
>>> lst = [{1, 2}, {0, 1}, {1, 2}]
如何归还独特的物品?
尝试众所周知的set()
不起作用:
>>> set(lst)
TypeError: unhashable type: 'set'
答案 0 :(得分:2)
如果“独特项目”表示唯一集合,则可以使用frozenset
,这是set
的可缓存但不可变的版本。您最初可以将您的集合构建为frozenset
个对象,或者如果您需要改变它们,请执行以下操作:
uniques = set(frozenset(s) for s in lst)
然后:
>>> uniques
set([frozenset([1, 2]), frozenset([0, 1])])
答案 1 :(得分:2)
In [8]: lst = [{1, 2}, {0, 1}, {1, 2}]
In [9]: reduce(set.union, lst)
Out[9]: {0, 1, 2}
以上更好的版本:
In [1]: lst = [{1, 2}, {0, 1}, {1, 2}]
In [2]: set.union(*lst)
Out[2]: {0, 1, 2}
答案 2 :(得分:1)
>>> reduce(lambda a, b: a.union(b), lst)
{0, 1, 2}
修改强>
鉴于OP似乎需要唯一的子集:
>>> set(tuple(sorted(s)) for s in lst)
{(0, 1), (1, 2)}
答案 3 :(得分:0)
您可以通过以下方式实现这一目标:
>>> lst = [{1, 2}, {0, 1}, {1, 2}]
>>> set(frozenset(s) for s in lst)
set([frozenset([1, 2]), frozenset([0, 1])])
查看Frozen Set文档以获取更多信息。
答案 4 :(得分:0)
def get_unique_sets(l):
unique_sets = []
for s in l:
if s not in unique_sets:
unique_sets.append(s)
return unique_sets
lst = [{1, 2}, {0, 1}, {1, 2}]
print(get_unique_sets(lst))
<强>输出强>
[{1, 2}, {0, 1}]
答案 5 :(得分:0)
您的输入列表项是否必须设置或者它们是否可以是元组?
set()
在我的测试中使用元组(py 2.7):
>>> lst = [(1,2), (0,1), (1,2)]
>>> set(lst)
set([(1, 2), (0, 1)])
如果您的输入始终是集合列表,您可以在之前转换为元组,然后转换回集合:
>>> lst = [{1, 2}, {0, 1}, {1, 2}]
>>> lst
[set([1, 2]), set([0, 1]), set([1, 2])]
>>> set(lst)
TypeError: unhashable type: 'set'
>>> lst2 = [tuple(x) for x in lst]
>>> lst2
[(1, 2), (0, 1), (1, 2)]
>>> lst2 = set(lst2)
>>> lst2
set([(1, 2), (0, 1)])
>>> lst2 = list(lst2)
>>> lst2
[(1, 2), (0, 1)]
>>> lst = [set(x) for x in lst2]
>>> lst
[set([1, 2]), set([0, 1])]
不确定这是否是最佳选择,但它适用于您给出的示例案例,希望这有帮助:)