Python - Как сопоставить элементы списка символ за символом - PullRequest
0 голосов
/ 31 октября 2018

У меня два списка

List1 = ['hello','welcome','india','nation']
List2 = ['ind', 'nat','hellooo','welcomeeee']

Я хочу сравнить элементы и напечатать, как показано ниже -

Выход:

['india','nation','hello','welcome']

пожалуйста, предложите какой-нибудь оптимизированный способ.

У меня есть список с неопределенным размером в каждом, но у него есть один элемент списка, совпадающий с другими элементами списка, как случайный, я не знаю размер самого высокого / самого длинного возможного соответствия в любом из списка.

Ответы [ 4 ]

0 голосов
/ 31 октября 2018

Понимание списка,

In [14]: [j for i in List2 for j in List1 if i in j or j in i]
Out[14]: ['india', 'nation', 'hello', 'welcome']
0 голосов
/ 31 октября 2018

Вы можете использовать расстояние Левенштейна , чтобы определить наиболее близкое соответствие, поэтому вот одна из реализаций Левенштейна:

def levenshteinDistance(s1, s2):
    if len(s1) > len(s2):
        s1, s2 = s2, s1

    distances = range(len(s1) + 1)
    for i2, c2 in enumerate(s2):
        distances_ = [i2+1]
        for i1, c1 in enumerate(s1):
            if c1 == c2:
                distances_.append(distances[i1])
            else:
                distances_.append(1 + min((distances[i1], distances[i1 + 1], distances_[-1])))
        distances = distances_
    return distances[-1]


List1 = ['hello', 'welcome', 'india', 'nation']
List2 = ['ind', 'nat', 'helloooo', 'welcomeeeeee']

[min(zip(List1, [levenshteinDistance(j, i) for j in List1]), key=lambda x: x[1])[0] for i in List2]
#['india', 'nation', 'hello', 'welcome']
0 голосов
/ 31 октября 2018

Аналогично @ решению AndreiDurnea , вы также можете использовать генератор:

def comparer(L1, L2):
    for i in L2:
        for j in L1:
            if (i in j) or (j in i):
                yield j

List1 = ['hello','welcome','india','nation']
List2 = ['ind', 'nat','helloooo','welcomeeeeee']

res = list(comparer(List1, List2))

['india', 'nation', 'hello', 'welcome']

Согласно комментарию @ pault, itertools.product с пониманием списка может быть более эффективным, чем генератор:

from itertools import product

res = [j for i, j in product(List2, List1) if (i in j) or (j in i)]
0 голосов
/ 31 октября 2018
List1 = ['hello','welcome','india','nation']
List2 = ['ind', 'nat','helloooo','welcomeeeeee']

Rezult = []

for firstItem in List1:
    for secondItem in List2: 
        if firstItem in secondItem or secondItem in firstItem:
            Rezult.append(firstItem)
            continue

print(Rezult)

выход для этого:

['hello', 'welcome', 'india', 'nation']

Я бы предложил переименовать переменные:

list_1 = ['hello','welcome','india','nation']
list_2 = ['ind', 'nat','helloooo','welcomeeeeee']

rezult = []

for firstItem in list_1:
    for secondItem in list_2: 
        if firstItem in secondItem or secondItem in firstItem:
            rezult.append(firstItem)            

print(rezult)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...