Элементы списка фильтра подстроки другим списком в Python - PullRequest
1 голос
/ 13 марта 2019

У меня есть два списка, которые выглядят так:

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', ']'].Как я могу отфильтровать это правильно?Спасибо.

Ссылка связана:

Можно ли отфильтровать список подстрок другим списком строк в Python?

Ответы [ 7 ]

3 голосов
/ 13 марта 2019

Вы можете использовать any:

list1 = ['bj-100-cy','bj-101-hd','sh-200-pd','sh-201-hp']
list2 = [100, 200]
list2 = [str(x) for x in list2]

outcome = [s for s in list1 if any(x in s for x in list2)]

any возвращает True, если какое-либо из условий, заданных вами, является True.

2 голосов
/ 13 марта 2019

Список понимания и any:

[i for i in list1 if any(i for j in list2 if str(j) in i)]

any, чтобы проверить, является ли какой-либо элемент list2 подстрокой элемента list1 (__contains__), который повторяется.

Пример:

In [92]: list1 = ['bj-100-cy','bj-101-hd','sh-200-pd','sh-201-hp']
    ...: list2 = [100, 200]
    ...: 

In [93]: [i for i in list1 if any(i for j in list2 if str(j) in i)]
Out[93]: ['bj-100-cy', 'sh-200-pd']
1 голос
/ 13 марта 2019

Вы можете использовать регулярное выражение:

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']
1 голос
/ 13 марта 2019

Вы можете использовать встроенный метод filter для фильтрации списка в зависимости от вашего состояния. Ваше условие требует, чтобы оператор python in искал иголку ([100, 200]) в стоге сена ([['bj-100-cy','bj-101-hd',...]]). Мы можем использовать метод contains для упрощения синтаксиса поиска.

код

from operator import contains
filter(lambda x: any(contains(x,str(y)) for y in list2), list1)

Пример

>>> list1 = ['bj-100-cy','bj-101-hd','sh-200-pd','sh-201-hp']
>>> list2 = [100, 200]
>>> for item in filter(lambda x: any(contains(x,str(y)) for y in list2), list1):
...     print(item)
...
bj-100-cy
sh-200-pd
1 голос
/ 13 марта 2019

Другое альтернативное понимание списка:

>>> 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']
1 голос
/ 13 марта 2019

Вы можете попробовать это:

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']
1 голос
/ 13 марта 2019
list1 = str(list1)
list2 = str(list2)

Вы преобразуете свой список в строку с приведенными выше инструкциями. Поэтому, когда вы повторяете цикл for, вы повторяете каждый символ, а не каждое слово.

Таким образом, вы должны удалить преобразование строк и вместо этого сделать понимание списка следующим образом. Кроме того, в вашем файле результатов вместо проверки, находится ли слово в списке list2 в списке list1, вы проверяете обратное. Таким образом, вы получили 100 и 200 в качестве символов, которые находятся в списке 2.

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]
...