python - 如何删除嵌套列表中具有重复元素的列表

时间:2018-03-22 05:33:22

标签: python

如果我有这样的列表列表:

a = [[1,2,3], [4,5], [1,2], [6,7]]

如何删除列表元素,以便删除甚至包含少量元素的嵌套列表?结果列表应该是:

a = [[4,5],[6,7]]

3 个答案:

答案 0 :(得分:2)

以下解决方案在概念上类似于 Julien 提出的解决方案,但具有不同的实现方式。

from collections import Counter
from itertools import chain
a = [[1,2,1], [4,5], [1,2], [6,7]]

计算重复项集。如果仅在子列表中重复两个项目,则不将它们视为重复项目。首先,获得所有项目的计数器。

counter = Counter(chain(*map(set, a)))
#Counter({2: 2, 1: 1, 4: 1, 5: 1, 3: 1, 6: 1, 7: 1})
dups = {val for val, count in counter.items() if count > 1}
#{1,2}

将重复项与每个子列表相交,并过滤 out 被欺骗的子列表:

list(filter(lambda sublist: not dups & set(sublist), a))
#[[4, 5], [6, 7]]

它适用于列表列表和元组列表。

答案 1 :(得分:1)

from collections import defaultdict

a = [[1,2,3], [4,5], [1,2], [6,7]]

# count how many times each item appears
count = defaultdict(int)
for l in a:
    for x in l:
        count[x] += 1

# keep only sublists where all element have a count of 1
[l for l in a if all(count[x] < 2 for x in l)]

答案 2 :(得分:-1)

如果所有交叉点都为空,那么您可以检查每个子列表与列表其余元素的交集。

>>> d = [[1,2,3], [4,5], [1,2], [6,7]]
>>> [a for a in d if all(len(set(a) & set(b)) == 0 for b in d if b!=a)]
>>> [[4, 5], [6, 7]]