Найти подходящие подстроки в двух списках - PullRequest
0 голосов
/ 28 июня 2018

У меня есть два списка: A и B. Длина списка не одинакова, и они оба содержат строки. Каков наилучший способ сопоставления подстрок в обоих списках?

list_A = ['hello','there','you','are']
list_B = ['say_hellaa','therefore','foursquare']

Я хотел бы получить список подходящих подстрок с именем list_C, который содержит:

list_C = ['hell','there','are']

Я наткнулся на этот ответ, но он требует, чтобы у меня был список подходящих подстрок Есть ли способ получить то, что я хочу, не создавая вручную список соответствующих подстрок?

Это также не помогает мне, потому что второй список содержит подстроки.

Ответы [ 5 ]

0 голосов
/ 28 июня 2018

Для забав, вот ответ, который использует регулярное выражение!

import re

matches = []
for pat in list_B:
    matches.append(re.search(pat, ' '.join(list_A)))
matches = [mat.group() for mat in matches if mat]
print(matches)
# ['hell', 'here']

Возвращает объект совпадения для каждого найденного совпадения, фактическая строка которого найдена match.group(). Обратите внимание, что если совпадение не найдено (как в случае со вторым элементом в вашем list_B), вы получите None в matches, таким образом, необходимо добавить if mat в конце списка понимания .

0 голосов
/ 28 июня 2018
list_A = ['hello','there','you','are']
list_B = ['hell','is','here']
List_C = []

for a in list_A:
    for b in list_B:
        print(a,"<->",b)
        if a in b:
            List_C.append(a)
        if b in a:
            List_C.append(b)

print(List_C)
0 голосов
/ 28 июня 2018

Поскольку вы помечаете pandas решение от str.contains

#S_A=pd.Series(list_A)
#S_B=pd.Series(list_B)

S_B[S_B.apply(lambda x : S_A.str.contains(x)).any(1)]
Out[441]: 
0    hell
2    here
dtype: object
0 голосов
/ 28 июня 2018

IIUC: я бы использовал Numpy

import numpy as np
from numpy.core.defchararray import find

a = np.array(['hello', 'there', 'you', 'are', 'up', 'date'])
b = np.array(['hell', 'is', 'here', 'update'])

bina = b[np.where(find(a[:, None], b) > -1)[1]]
ainb = a[np.where(find(b, a[:, None]) > -1)[0]]

np.append(bina, ainb)

array(['hell', 'here', 'up', 'date'], dtype='<U6')
0 голосов
/ 28 июня 2018

Это один из подходов. Используя list comprehension.

list_A = ['hello','there','you','are']
list_B = ['hell','is','here']
jVal = "|".join(list_A)        # hello|there|you|are

print([i for i in list_B if i in jVal ])

Выход:

['hell', 'here']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...