объединить две части слова в списке с помощью итератора - PullRequest
0 голосов
/ 01 марта 2019

Мне нужно объединить некоторые слова, которые отображаются в списке слов как отдельные, например "computer" (ниже).Эти слова появляются в списке разделенными из-за разрывов строк, и я хочу это исправить.

lst=['love','friend', 'apple', 'com', 'puter']

ожидаемый результат:

lst=['love','friend', 'apple', 'computer']

Мой код не работает.Может ли кто-нибудь помочь мне сделать это?

код, который я пытаюсь это:

from collections import defaultdict
import enchant
import string
words=['love', 'friend', 'car', 'apple', 
'com', 'puter', 'vi']
myit = iter(words)
dic=enchant.Dict('en_UK')
lst=[]

errors=[]

for i in words:

   if  dic.check(i) is True:

      lst.append(i)
   if dic.check(i) is False:

      a= i + next(myit)

   if dic.check(a) is True:

      lst.append(a)

   else:

     continue



print (lst)`

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Несмотря на тот факт, что этот метод не очень надежен (например, вы бы пропустили "Ham-Burger"), основная ошибка заключалась в том, что вы выполняли не цикл в итераторе, а в самом списке.Вот исправленная версия.

Обратите внимание, что я переименовал переменные, чтобы дать им более выразительные имена, и заменил словарную проверку простой word in dic на словарь-образец - импортируемый вами модуль не является частьюстандартная библиотека, которая делает ваш код сложным для запуска для тех, у кого его нет.

dic = {'love', 'friend', 'car', 'apple', 
       'computer', 'banana'}

words=['love', 'friend', 'car', 'apple', 'com', 'puter', 'vi']
words_it = iter(words)

valid_words = []

for word in words_it:
    if word in dic:
        valid_words.append(word)
    else:
        try:
            concacenated = word + next(words_it)
            if concacenated in dic:
                valid_words.append(concacenated)
        except StopIteration:
            pass

print (valid_words)
# ['love', 'friend', 'car', 'apple', 'computer']

Вам нужна часть try ... except, если последнее слово в списке отсутствуетсловарь, так как next() будет поднимать StopIteration в этом случае.

0 голосов
/ 01 марта 2019

Основная проблема с вашим кодом заключается в том, что вы, с одной стороны, выполняете итерацию words в цикле for, а с другой стороны, через итератор myit.Эти две итерации независимы, поэтому вы не можете использовать next(myit) в вашем цикле, чтобы получить слово после i (также, если i - последнее слово, следующего слова не будет).С другой стороны, ваша проблема может быть осложнена тем фактом, что могут быть разделены слова с частями, которые тоже есть в словаре (например, printable - это слово, но также print и able).

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

import enchant

words = ['love', 'friend', 'car', 'apple', 'com', 'puter', 'vi']
myit = iter(words)
dic = enchant.Dict('en_UK')
lst = []
# The word that you are currently considering
current = ''
for i in words:
    # Add the next word
    current += i
    # If the current word is in the dictionary
    if dic.check(current):
        # Add it to the list
        lst.append(current)
        # Clear the current word
        current = ''
    # If the word is not in the dictionary we keep adding words to current

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