检查列表列表中的列表元素并返回子列表
Checking if list element in list of lists and returning sublist
我有两个列表
list1 = ['B', 'C', 'D']
list2 = [['1', 'A'], ['2', 'B'], ['3', 'D'], ['5', 'C']]
并希望 return list2 的那些包含 list1 元素的子列表。
到目前为止,我尝试使用任何:
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']]
你所拥有的看起来正确并且在本地也适用于我:
for l2 in list2:
if any (item in l2 for item in list1):
result.append(l2)
它returns [['2', 'B'], ['3', 'D'], ['5', 'C']]
哪个是预期的结果?
另请注意,您可以通过将 list1 更改为集合 list1 = set(['B', 'C', 'D'])
并将 if 条件更改为 if any (item in list1 for item in l2):
.
来加快实施速度
这是因为如果 list1
是 set
,item in list1
比 list
快得多。那是因为 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
。
我有两个列表
list1 = ['B', 'C', 'D']
list2 = [['1', 'A'], ['2', 'B'], ['3', 'D'], ['5', 'C']]
并希望 return list2 的那些包含 list1 元素的子列表。 到目前为止,我尝试使用任何:
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']]
你所拥有的看起来正确并且在本地也适用于我:
for l2 in list2:
if any (item in l2 for item in list1):
result.append(l2)
它returns [['2', 'B'], ['3', 'D'], ['5', 'C']]
哪个是预期的结果?
另请注意,您可以通过将 list1 更改为集合 list1 = set(['B', 'C', 'D'])
并将 if 条件更改为 if any (item in list1 for item in l2):
.
来加快实施速度
这是因为如果 list1
是 set
,item in list1
比 list
快得多。那是因为 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
。