我有两个看起来像这样的列表:
list1 = ['bj-100-cy','bj-101-hd','sh-200-pd','sh-201-hp']
list2 = [100, 200]
我想按list1
的元素对list2
进行子字符串过滤,并获得如下所示的预期输出:
outcome = ['bj-100-cy', 'sh-200-pd']
这样做时:
list1 = str(list1)
list2 = str(list2)
outcome = [x for x in list2 if [y for y in list1 if x in y]]
我得到这样的结果:['[', '1', '0', '0', ',', ' ', '2', '0', '0', ']']
。
如何正确过滤?谢谢。
与参考相关:
Is it possible to filter list of substrings by another list of strings in Python?
答案 0 :(得分:1)
list1 = str(list1)
list2 = str(list2)
您正在使用上述语句将列表转换为字符串。因此,当您在for循环中进行迭代时,您将迭代每个字符而不是每个单词。
因此,您应该删除字符串转换,而改为执行列表理解,如下所示。 同样,在结果文件中,您没有检查list2中的单词是否在list1中,而是进行了相反的检查。因此,清单2中有100和200个字符。
list1 = ['bj-100-cy','bj-101-hd','sh-200-pd','sh-201-hp']
list2 = [100, 200]
outcome = [x for x in list1 for y in list2 if str(y) in x]
答案 1 :(得分:1)
您可以尝试以下一种方法:
list1 = ['bj-100-cy','bj-101-hd','sh-200-pd','sh-201-hp']
list2 = [100, 200]
outcome = []
for item in list1:
if any(str(i) in item for i in list2):
outcome.append(item)
输出:
['bj-100-cy', 'sh-200-pd']
答案 2 :(得分:1)
另一种列表理解方法:
>>> list1 = ['bj-100-cy','bj-101-hd','sh-200-pd','sh-201-hp']
>>> list2 = [100, 200]
>>> occur = [i for i in list1 for j in list2 if str(j) in i]
>>> occur
['bj-100-cy', 'sh-200-pd']
答案 3 :(得分:1)
您可以使用正则表达式:
import re
list1 = ['bj-100-cy', 'bj-101-hd', 'sh-200-pd', 'sh-201-hp']
list2 = [100, 200]
pattern = re.compile('|'.join(map(str, list2)))
list(filter(lambda x: pattern.search(x), list1))
# ['bj-100-cy', 'sh-200-pd']