将一个列表的列表与另一个列表进行比较,返回共同的部分。

4

假设我有以下嵌套列表:

list1 = [[A,B],[C,D],[E, F]]
list2 = [A, B, F]

我希望有一个函数可以返回与第一个列表相同的公共列表。这个例子的期望结果应该是:
result = [[A,B],[],[F]]

我已经尝试遍历list1中的每个元素,并通过与list2进行比较创建一个新的数组,将每个元素附加到其中。我知道如何遍历列表的列表,但我找不到创建“result”的列表的方法。
这些列表不大,大约有5个元素。有可能会重复项目,但在整个列表内部列表中的顺序并不重要。

在您的实际数据中,这些列表有多大,特别是 list2?如果 list2 很大,将其转换为集合会更快。 - PM 2Ring
另外,list2或者list1的子列表中是否可能包含重复项?在新的子列表中,您需要保留原始顺序吗? - PM 2Ring
1
即使代码不起作用,也要展示出来。 - Mad Physicist
@PM2Ring 它们不是很大,大约有5个元素。是的,项目可能会重复,但在整个列表中,列表内部的顺序并不重要。谢谢! - edualvarado
@ealvaradop 谢谢您提供的信息!但是您应该将它放在问题本身中,不要把它埋在评论区里。 - PM 2Ring
5个回答

6
使用集合运算,非常简单快捷:
set2 = set(list2)
[list(set(e) & set2) for e in list1]

如果列表可以包含非唯一项,那么...让我们使用计数器!
from collections import Counter
counter2 = Counter(list2)
[list((Counter(e) & counter2).elements()) for e in list1]

然而,如果list2包含某个特定值的多个副本,则无法工作。 - tahesse
@Thomas,你的情况应该是什么? - Brown Bear
@Thomas:这很公平。但是,话说回来,OP没有数据来表示这种情况。 - Amadan
1
@Thomas 是的。正如@BearBrown所说,问题在于在这种情况下输出并没有被完全定义,并且需要OP进行额外的澄清。例如,对于list1=[[1, 1, 1, 2, 2]]list2=[1, 1, 2, 2, 2],输出应该是[[1, 1, 2, 2]] - 然而目前的解决方案都没有产生它 - 所以仅仅抱怨我的解决方案并不公平 :D 但非常好,接受挑战! - Amadan
1
@PM2Ring:那么我的第二个解决方案可能是正确的(不保留顺序,处理重复项)。 - Amadan
显示剩余2条评论

5
这是一种方法。使用列表推导式。
例子:
list1 = [["A","B"],["C","D"],["E", "F"]]
list2 = ["A", "B", "F"]

result = [[j for j in i if j in list2] for i in list1]
print(result)

输出:

[['A', 'B'], [], ['F']]

我从未学过Python中的这个功能,我得去了解一下。谢谢@Rakesh。 - vividpk21
如果你在Python中从未学习过列表推导式,那么你的老师很糟糕。 - PM 2Ring
1
解决方案很好,@Rakesh。我知道列表推导式,但这个想法没想到。谢谢! - edualvarado

4
使用setintersection
In [18]: [list(set(item).intersection(list2)) for item in list1]
Out[18]: [['A', 'B'], [], ['F']]

遍历列表中的列表,并找到与基本列表的交集。

或者,使用列表推导式

In [16]: [[i for i in item if i in list2]for item in list1]
Out[16]: [['A', 'B'], [], ['F']]

@Thomas,你可以看到时间,我们几乎同时发布了。因此,更新了另一个解决方案。 - Rahul K P
1
请指出您的解决方案提议与其他提议之间的相似之处。谢谢。已取消踩赞。 - tahesse
@Thomas 回答者没有义务将他们的答案与其他答案进行比较。但是如果他们在代码中添加一些解释,那就很好了... - PM 2Ring

0

使用基本的Python语言,

list1=[[1, 1, 1, 2, 2]]
list2=[1, 1, 2, 2, 2]

result = []
for sublist in list1:
    filtered = []
    for item in sublist:
        if item in list2:
            filtered.append(item)
    result.append(filtered)

print(result)

提供

[[1, 1, 1, 2, 2]]

[Program finished]

-3
listA = [['A','B'],['C','D'],['E', 'F']]
listB = ['A', 'B', 'F']
listOut = []
for item in listA:
    temp = []
    for inner in item:
        for b in listB:
            if inner == b:
                temp.append(b)
    listOut.append(temp)


print(listOut)

这将会执行你所要求的操作。


[Program finished] ``` which is incorrect for ```list1=[[1, 1, 1, 2, 2]] list2=[1, 1, 2, 2, 2]``` - Subham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接