如何从python中的列表列表中获取唯一的组合值

时间:2019-05-07 19:28:49

标签: python python-2.7 unique

我有一个类似清单的清单

items = [[1, 2], [2, 3], [2, 1], [1, 2]]

只需要从集合中提取唯一的组合,而无需重复。例如[1,2]和[2,1]相同。在这种情况下,我们只需要考虑一组。

预期输出:[[1,2],[2,3]]

如何使用python实现此目标?

6 个答案:

答案 0 :(得分:6)

items = [[1, 2], [2, 3], [2, 1], [1, 2]]
result = {tuple(sorted(c)) for c in items}
print(result)  # {(1, 2), (2, 3)}

请注意这会如何影响结果中组合的顺序和组合中的数字。

答案 1 :(得分:2)

获得所需内容的最小代码如下。如果必须将结果显示为列表列表,则需要包装器

if()

或者,如果不能保证列表中的每个项目在该列表中都是唯一的,

java -jar yourJarFile.jar

答案 2 :(得分:1)

您可以将所有内部列表冻结为frozenset并创建一组外部列表。

def deep_frozenset(container):
    """Freeze all lists into frozensets."""

    if isinstance(container, list):
        return frozenset(deep_frozenset(el) for el in container)
    else:
        return container

result = deep_frozenset(items)
assert result == frozenset({frozenset({2, 3}), frozenset({1, 2})})

您甚至可以编写deep_thawset来撤消操作。

def deep_thawset(container):
    """Thaw all frozensets back into lists."""

    is isinstance(container, frozenset):
        return [deep_thawset(el) for el in container]
    else:
        return container

您甚至可以写往返票。

def roundtrip(container):
    """Find all unique combinations.

    >>> roundtrip([[1, 2], [2, 3], [2, 1], [1, 2]])
    [[1, 2], [2, 3]]
    """

    deep_thawset(deep_frozenset(container))

答案 3 :(得分:1)

您可以使用一组冻结集进行查找:

items = [[1, 2], [2, 3], [2, 1], [1, 2]]

result = []
lookup = set()

for subl in items:
    fs = frozenset(subl)
    if fs not in lookup:
        result.append(subl)
        lookup.add(fs)

print(result)
# [[1, 2], [2, 3]]

答案 4 :(得分:0)

items = [[1, 2], [2, 3], [2, 1], [1, 2]]
r=[list(i) for i in list({tuple(sorted(c)) for c in items})]
print(r) # [[1, 2], [2, 3]]

items = [[1, 2], [2, 3], [2, 1], [1, 2]]    
u = [list(x) for x in set(tuple(x) for x in list( sorted(c) for c in items))]    
print(u) # [[1, 2], [2, 3]]

items = [[1, 2], [2, 3], [2, 1], [1, 2]]
d = list(list(x) for x in { (v,k) if k>=v else (k,v) for k, v in items  })
print(d) # [[1, 2], [2, 3]]

答案 5 :(得分:0)

您可能想要一组冻结集:

items = set(frozenset(item) for item in [[1, 2], [2, 3], [2, 1], [1, 2]])
items
{frozenset({1, 2}), frozenset({2, 3})}

冻结集是不可变的,这使它们成为可散列的,这对于用作集合元素是必需的。

最后,要完全达到所需的输出,请从您的集合中创建列表:

list(list(item) for item in items)
[[1, 2], [2, 3]]