我有一个类似清单的清单
items = [[1, 2], [2, 3], [2, 1], [1, 2]]
只需要从集合中提取唯一的组合,而无需重复。例如[1,2]和[2,1]相同。在这种情况下,我们只需要考虑一组。
预期输出:[[1,2],[2,3]]
如何使用python实现此目标?
答案 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]]