Как сравнить два списка, чтобы сохранить совпадающие подстроки? - PullRequest
0 голосов
/ 02 ноября 2018

Как я могу описать, у меня есть два списка строк, и я хочу вернуть все результаты из списка A, которые содержат любую из строк в списке B. Вот подробности:

A = ['dataFile1999', 'dataFile2000', 'dataFile2001', 'dataFile2002']
B = ['2000', '2001']

Как мне вернуть

C = ['dataFile2000', 'dataFile2001']?

Я изучал списки, делал что-то вроде ниже

C=[x for x in A if B in A] 

но я не могу заставить его работать. Я на правильном пути?

Ответы [ 3 ]

0 голосов
/ 02 ноября 2018

Вы можете использовать any () , чтобы проверить, есть ли какой-либо элемент вашего списка B в x:

A = ['dataFile1999', 'dataFile2000', 'dataFile2001', 'dataFile2002']

B = ['2000', '2001'] 

c = [x for x in A if any(k in x for k in B)]

print(c)

Выход:

['dataFile2000', 'dataFile2001']
0 голосов
/ 02 ноября 2018

Сначала я бы построил set лет для времени поиска O (1). 1

>>> A = ['dataFile1999', 'dataFile2000', 'dataFile2001', 'dataFile2002']
>>> B = ['2000', '2001']
>>> 
>>> years = set(B)

Теперь оставьте только элементы A, заканчивающиеся элементом years.

>>> [file for file in A if file[-4:] in years]
>>> ['dataFile2000', 'dataFile2001']

1 Если у вас очень маленькие списки (два элемента, безусловно, соответствуют), сохраните списки. Наборы имеют O (1) поиск, но хеширование по-прежнему приводит к накладным расходам.

0 голосов
/ 02 ноября 2018

Вы были близки, используйте любой :

C=[x for x in A if any(b in x for b in B)]

Подробнее:

A = ['dataFile1999', 'dataFile2000', 'dataFile2001', 'dataFile2002']
B = ['2000', '2001']

C = [x for x in A if any(b in x for b in B)]

print(C)

выход

['dataFile2000', 'dataFile2001']
...