这是我遇到问题的任务:
给出2个列表列表,将它们过滤到只有没有任何共同点的项目。 E. g。如果内部列表相同,请将其过滤掉。如果内部列表至少有一个共同的项目,也会将其过滤掉。
注意:只有一个级别的嵌套。内部列表仅包含字符串。我有一个有效的解决方案,但它非常混乱。寻求改进的反馈意见:
首先,我会过滤掉两个列表中的完全匹配项:
l3 = filter(lambda x: x not in l2, l1)
l4 = filter(lambda x: x not in l1, l2)
我最终得到了两个没有完全相同项目的列表。现在我想迭代内部列表,并删除任何与另一个内部列表共享项目的内容。
我在做:
for i in l3:
for j in i:
for k in l4:
if j in k:
print j, k
removel3.append(tuple(i))
removel4.append(tuple(k))
for i in l4:
for j in i:
for k in l3:
if j in k:
removel3.append(tuple(k))
removel4.append(tuple(i))
for i in list(set(removel3)):
l3.remove(list(i))
for i in list(set(removel4)):
l4.remove(list(i))
(构建单独的列表以从列表中删除,因为直接在迭代循环中删除会混淆列表索引并跳过项目。必须有更好的方法来执行此操作,但我不知道它。)< / p> 但是,是的。它完成了工作,但是从元组到集合到列表再到更多元组......听起来非常非智能。 :)很高兴看到任何反馈!
编辑:
示例输入:
l1 = [['A', 'B', 'C'], ['D', 'E'], ['F', 'G', 'H']]
l2 = [['A', 'B', 'C'], ['D', 'I'], ['K', 'L', 'M']]
在完成上述所有转换之后,最终得到:
>>> l3
[['F', 'G', 'H']]
>>> l4
[['K', 'L', 'M']]
答案 0 :(得分:4)
我不确定我是否了解你,但我会试一试。
# first, get all elements from each list as a flat set.
import itertools
set1 = set(itertools.chain.from_iterable(list1))
set2 = set(itertools.chain.from_iterable(list2))
#Now, figure out which elements they have in common
common_elements = set1 & set2
#Now eliminate inner lists which have elements in the common set
new_list1 = [lst for lst in list1 if not any(x in common_elements for x in lst)]
new_list2 = [lst for lst in list2 if not any(x in common_elements for x in lst)]
请注意,我可以执行此操作,因为子列表包含可清除对象。
答案 1 :(得分:2)
我认为这样的过滤器就是你想要的
filter(lambda sublist:not any(set(sublist).intersection(x) for x in list2),list1)