[英]Nested list comprehension understanding for comparing strings in python
我有两个清单
l1 = ["filea", "fileb", "filec"]
l2 = ["a", "b"]
我想生成一个结果列表l3
,其中包含包含 l2 元素的 l1 元素。 所以最后我想要
l3 = ["filea", "fileb"]
我只是不知道如何使用列表理解来做到这一点......我试过:
l3 = [x for x in l1 for y in l2 if y in x]
它有效......
我只想了解这里真正发生了什么以及以何种顺序发生。 对于任何帮助,我将不胜感激!
同样可以写成:
l3 = []
for x in l1:
for y in l2:
if y in x:
l3.append(x)
您可以简单地循环所有列表并检查l2
中是否存在l1
元素中的元素
l1 = ["filea", "fileb", "filec"]
l2 = ["a", "b"]
l3 = list({x for x in l1 for y in l2 if x[-1] in l2})
# Or
l3 = [x for x in l1 for y in l2 if y in x]
print(l3)
你只是循环了l1
和l2
因为在 python 中你可以像在列表中那样对字符串进行索引,并且你还可以检查一个字符是否出现在整个字符串中,所以if y in x
你检查了字符y
出现在字符串x
l3 = []
for x in l1:
for y in l2:
if y in x:
l3.append(x)
['filea', 'fileb']
当你写:
l3 = [x for x in l1 for y in l2 if y in x]
它等于以下内容:
l3 = []
for x in l1: # loop through each element in the list l1
for y in l2: # loop through each element in the list l2
if y in x: # if x contains y
l3.append(x)
你可以做
l3 = [s for s in l1 if any(c in s for c in l2)]
更有效的解决方案是使用正则表达式:
import re
pattern = re.compile('|'.join(map(re.escape, l2)))
l3 = list(filter(pattern.search, l1)) # Equivalent to [s for s in l1 if pattern.search(s)]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.