Python - как сопоставить элементы списка по символу с символом

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

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

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

Выход :

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

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

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

Как именно вы хотите сравнить элементы?

Nick Parsons 31.10.2018 12:25

Я полагаю, что вывод должен быть с «nat», а не с «nation», также с «ind», а не с «india».

Durdu 31.10.2018 12:25

"Оптимизированный способ?" У вас есть код, который реализует это неоптимизированным способом, которым вы можете поделиться? Есть ли ограничения по сложности? Здесь есть довольно простое решение для квадратичного времени.

pault 31.10.2018 12:28

@pault Я пробовал разбивать список по индексам, но это не точно. Поскольку я не знаю максимального предела любого элемента списка (размера)

Naitik Chandak 31.10.2018 12:32
1
4
696
4

Ответы 4

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)

@pault Не могли бы вы объяснить поподробнее?

Naitik Chandak 01.11.2018 03:56

Посмотрите порядок вывода.

jpp 01.11.2018 08:02

О, это означает, что он печатает только первый список, любое другое альтернативное решение для этого.?

Naitik Chandak 01.11.2018 11:11

@naitik_chandakna используйте ответ jpp

pault 01.11.2018 11:55

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

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

Возможно, излишне реализовать вашу собственную функцию Левенштейна, но, по крайней мере, это дает правильный результат. Редактировать: Я не голосующий против

pault 31.10.2018 15:18

@pault Спасибо, что не проголосовали против :) Что ж, мне нравится Левенштейн, и я использую все возможности для его продвижения :)

zipa 31.10.2018 15:47

У меня до сих пор есть некоторая путаница в этом. Я не получаю требуемый результат.

Naitik Chandak 01.11.2018 07:03

Подобно Решение @ 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)]

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

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

Мне нравится это [i для i в List1 для j в List2, если i в j или j в i]. Не могли бы вы указать мне, где я могу узнать больше об этом синтаксическом сахаре?

Durdu 31.10.2018 13:12

Не могли бы вы объяснить поподробнее?

Naitik Chandak 01.11.2018 11:04

@pault Обновил мой ответ. Кстати, это для упоминания

Rahul K P 01.11.2018 19:55

Другие вопросы по теме