Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 检查列表列表中的列表元素是否存在并返回子列表_Python_Python 3.x_List_Any - Fatal编程技术网

Python 检查列表列表中的列表元素是否存在并返回子列表

Python 检查列表列表中的列表元素是否存在并返回子列表,python,python-3.x,list,any,Python,Python 3.x,List,Any,我有两张单子 list1 = ['B', 'C', 'D'] list2 = [['1', 'A'], ['2', 'B'], ['3', 'D'], ['5', 'C']] 并希望返回包含list1元素的list2子列表。 到目前为止,我试过使用任何: result = [] for l2 in list2: if any (item in l2 for item in list1): result.append(l2) 和一种天真的方法 for l2 in li

我有两张单子

list1 = ['B', 'C', 'D']
list2 = [['1', 'A'], ['2', 'B'], ['3', 'D'], ['5', 'C']]
并希望返回包含list1元素的list2子列表。 到目前为止,我试过使用任何:

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']]
不确定,我错在哪里了。是否有一种方法可以使用列表理解或混合列表理解和“any”函数?

试试以下方法:

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

[['2', 'B'], ['3', 'D'], ['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']]
这是预期的结果,对吗

还请注意,您可以通过将列表1更改为集合
list1=set(['B','C','D'])
并将if条件更改为
if any(列表1中的项用于l2中的项):


这是因为如果
list1
set
而不是
列表,则列表1中的
项要快得多。这是因为
set
在引擎盖下使用hashmap,可以快速访问元素。

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

for l2 in list2:
    if any (item in l2 for item in list1):
        result.append(l2)
它返回
[['2',B'],['3',D'],['5',C']]
这是预期的结果,对吗

还请注意,您可以通过将列表1更改为集合
list1=set(['B','C','D'])
并将if条件更改为
if any(列表1中的项用于l2中的项):


这是因为如果
list1
set
而不是
列表,则列表1中的
项要快得多。这是因为
set
在引擎盖下使用hashmap,可以快速访问元素。

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

>>> 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
过滤器中将其视为假值


也就是说,我无法重现问题中的(第一个)代码不适用于您的事实;我一试就行了。您的第二个代码段(除了键入之外)在输出中存在重复子列表的潜在问题,因为在找到第一个匹配项后,您不会从内部循环中断开。

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

>>> 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
过滤器中将其视为假值


也就是说,我无法重现问题中的(第一个)代码不适用于您的事实;我一试就行了。您的第二个代码段(除了键入之外)在输出中存在重复子列表的潜在问题,因为您在找到第一个匹配项后没有从内部循环中断开。

哪里是
['3','D']
?您的第一个代码段应该给出预期的输出,而不是空列表。你运行了你的代码吗?你的第二个代码段也运行了吗?除了列表1中l1的输入错误:
Where is
['3','D']
?你的第一个代码段应该给出你的预期输出,而不是空列表。您运行了代码吗?您的第二个代码段也运行了吗?除了列表1中l1的输入错误: