子串过滤器列表元素由Python中的另一个列表

时间:2019-03-13 06:09:26

标签: python string list filter list-comprehension

我有两个看起来像这样的列表:

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?

4 个答案:

答案 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']