如果我有这样的列表列表:
a = [[1,2,3], [4,5], [1,2], [6,7]]
如何删除列表元素,以便删除甚至包含少量元素的嵌套列表?结果列表应该是:
a = [[4,5],[6,7]]
答案 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]]