我有一个二维列表
a = [[1, 2], [1, 3], [2, 1], [2, 3], [3, 1], [3, 2]]
如何获得结果:
result = [[1,2],[1,3],[2,3]]
无论重复项在内部列表中的顺序如何,都会删除重复项。
答案 0 :(得分:1)
尝试使用一组记录来跟踪您看到的列表:
from collections import Counter
a = [[1, 2], [1, 3], [2, 1], [2, 3], [3, 1], [3, 2], [1, 2, 1]]
seen = set()
result = []
for lst in a:
current = frozenset(Counter(lst).items())
if current not in seen:
result.append(lst)
seen.add(current)
print(result)
哪个输出:
[[1, 2], [1, 3], [2, 3], [1, 2, 1]]
注意:由于列表不具有散列功能,因此您可以存储Counter
个对象的冻结集来检测顺序少的重复项。这完全消除了排序的需要。
答案 1 :(得分:0)
In [3]: b = []
In [4]: for aa in a:
...: if not any([set(aa) == set(bb) for bb in b if len(aa) == len(bb)]):
...: b.append(aa)
In [5]: b
Out[5]: [[1, 2], [1, 3], [2, 3]]
答案 2 :(得分:-1)
虽然我喜欢@RoadRunner的FrozenSet想法(集合很有用,并且它们可以让您找到独特的元素而无需重新发明轮子/试图比开发Python的人更聪明),但是您也可以尝试这样的方法您只是想删除每个元素的反向子列表。缺点是,如果您有一堆非重复项,那么它可能会过于昂贵:
a = [[1, 2], [1, 3], [2, 1], [2, 3], [3, 1], [3, 2]]
result = a.copy()
for x in result:
try:
result.remove([x[-1::-1])
except:
pass
>>> [[1, 2], [1, 3], [2, 3]]
这应该适用于任意大小的子列表。
答案 3 :(得分:-1)
“设置”概念将在这里派上用场。您拥有的列表(包含重复项)可以转换为Set(永远不包含重复项)。 在这里找到有关集合的更多信息:Set
示例:
l = ['foo', 'foo', 'bar', 'hello']
可以直接创建一个集合:
s = set(l)
现在是否检查列表的内容
print(s)
>>> {'foo', 'bar', 'hello'}
Set将以这种方式与任何可迭代对象一起使用! 希望对您有帮助!