繁体   English   中英

检查列表列表中的列表元素并返回子列表

[英]Checking if list element in list of lists and returning sublist

我有两个清单

list1 = ['B', 'C', 'D']
list2 = [['1', 'A'], ['2', 'B'], ['3', 'D'], ['5', 'C']]

并且想要返回那些包含 list1 元素的 list2 的 sublistst。 到目前为止,我尝试使用任何:

result = []

for l2 in list2:
    if any (item in l2 for item in list1):
        result.append(l2)

和天真的方法

for l2 in list2:
    for l1 in l1:
        if l1 in l2:
            result.append(l2)

但我只设法重复空列表。 结果应该是

result = [['2', 'B'], ['5', 'C']]

不确定,我哪里出错了。 有没有办法使用列表理解或混合列表理解和“任何”函数?

尝试这个:

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

[['2', 'B'], ['3', 'D'], ['5', 'C']]

您所拥有的看起来正确并且在本地也适用于我:

for l2 in list2:
    if any (item in l2 for item in list1):
        result.append(l2)

它返回[['2', 'B'], ['3', 'D'], ['5', 'C']]这是预期的结果,对吗?

另请注意,您可以通过将 list1 更改为 set list1 = set(['B', 'C', 'D'])并将 if 条件更改为if any (item in list1 for item in l2):来加快实现速度if any (item in list1 for item in l2):
这是因为如果list1是一个set不是一个list那么list1中的item in list1会快得多。 那是因为set在后台使用了一个 hashmap 来快速访问元素。

如果元素是可散列对象(如本例中的字符串),则可以使用集合交集:

>>> list1 = ['B', 'C', 'D']
>>> list2 = [['1', 'A'], ['2', 'B'], ['3', 'D'], ['5', 'C']]

>>> s = set(list1)
>>> [l for l in list2 if set(l) & s]
[['2', 'B'], ['3', 'D'], ['5', 'C']]

如果交集为空,则出于列表理解中的if过滤器的目的,将其视为假值。

这就是说,我不能重现的事实,问题的(第一个)的代码是不是为你工作; 当我尝试时它工作正常。 您的第二个代码片段(除了拼写错误)在输出中存在重复子列表的潜在问题,因为您在找到第一个匹配项后没有break内部循环。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM