集合列表中的唯一项目

时间:2016-08-24 01:18:30

标签: python

如果我有套装清单:

>>> lst = [{1, 2}, {0, 1}, {1, 2}]

如何归还独特的物品?

尝试众所周知的set()不起作用:

>>> set(lst)
TypeError: unhashable type: 'set'

6 个答案:

答案 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])]

不确定这是否是最佳选择,但它适用于您给出的示例案例,希望这有帮助:)