объединить две строки, которые находятся в разных списках - PullRequest
1 голос
/ 14 марта 2019

Мне нужно объединить две строки, которые находятся в разных списках, и проверить, есть ли строка вывода в словаре.Код, который я пробовал:

x=['casa','lo','pre','computer']
y=['music','sun','ve','sident','house']
dic=['sunday','love','president','house','computer']
text=[]
errors=[]
iter_y=iter(y)
iter_x=iter(x)

for i in iter_x:
    if i in dic:
        text.append(i)
    else:
        try:
            concatenated= i + next(iter_y)
            if concatenated in dic:
                text.append(concatenated)
      except StopIteration:
          continue
        else:
            errors.append(i)
   print (text)

Этот код возвращает только то слово, которое является общим для x и y («Компьютер»).Мой желаемый результат - x = [любовь, президент, компьютер] То есть со словами «любовь» и «президент», соединенными в выводе.

Ответы [ 5 ]

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

IIUC, затем вы можете использовать itertools.product, чтобы получить произведение двух разных списков, а затем выполнить пересечение наборов, чтобы найти общие слова

from itertools import product
x=['casa','lo','pre','computer']
y=['music','sun','ve','sident','house']
dic=['sunday','love','president','house','computer']
set(list(map(''.join, list(product(x, y)))) + x + y) & set(dic)

ВЫХОД:

{'computer', 'house', 'love', 'president'}

Еслиожидаемый результат не должен включать house из второго списка, а затем не добавлять список y в окончательный составной список

set(list(map(''.join, list(product(x, y)))) + x) & set(dic)

OUTPUT

{'computer', 'love', 'president'}
0 голосов
/ 14 марта 2019

Вот простая версия, ничего особенного.Другие предложили варианты, которые, вероятно, более эффективны;однако, я думаю, что это решение захватывает ваше желаемое решение лучше, чем некоторые (например, путем проверки всех вариантов конкатенации).

Вы захотите использовать наборы, если вы выполняете много поисков.

x = ['casa','lo','pre','computer']
y = ['music','sun','ve','sident','house']
dic = set(['sunday','love','president','house','computer'])
in_dic = set()
for str in y:
    if str in dic:
        in_dic.add(str)
for str1 in x:
    if str1 in dic:
        in_dic.add(str1)
    for str2 in y:
        str3 = str1 + str2
        str4 = str2 + str1
        if str3 in dic:
            in_dic.add(str3)
        if str4 in dic:
            in_dic.add(str4)

print(list(in_dic))
['president', 'love', 'computer', 'house']
0 голосов
/ 14 марта 2019

Это у вас работает?

x=['casa','lo','pre','computer']
y=['music','sun','ve','sident','house']
dic=['sunday','love','president','house','computer']

possibles = []
possibles += x
possibles += y # if you want the house...

hits = []
for a in x:
    for b in y:
        possibles.append(a+b)
for a in y:
    for b in x:
        possibles.append(a+b)

for p in possibles:
    if p in dic:
        hits.append(p)

print(p)
0 голосов
/ 14 марта 2019

Для одного вкладыша используйте filter, ''.join и добавьте [''] во второй список (чтобы вам не нужно было делать два if с):

list(filter(lambda i: i in dic, [''.join((s1, s2)) for s1 in x for s2 in (y + [''])]))
>>['love', 'president', 'computer']
0 голосов
/ 14 марта 2019

При вашем подходе вам нужно переустанавливать итератор на y каждый раз, когда вы пытаетесь ввести новое значение в x.

Это может быть понятнее, например:

for i in x:
  if i in dic:
    text.append(i)
  else:
    for j in y:
      concatenated = i + j
      if concatenated in dic:
        text.append(concatenated)

for j in y пробует все вещи в y, иначе он движется каждый раз и никогда не оглядывается назад.

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