使用迭代器将单词中的两个部分串联在一起

时间:2019-03-01 11:18:53

标签: python string list iterator concatenation

我需要连接出现在单词列表中的某些单词,例如"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 :(得分:1)

代码的主要问题是,一方面,您在for循环中迭代myit,另一方面,通过迭代器next(myit)。这两个迭代是独立的,因此您不能在循环内使用i来获得i之后的单词(而且,如果printable是最后一个单词,则不会有下一个单词)。另一方面,您的问题可能会因以下事实而变得复杂:在词典中可能存在拆分单词,而单词的部分也是如此(例如print是一个单词,而able和{{1也是这样) }}。

假设有一个简单的场景,其中词典中永远不会出现拆分词部分,那么我认为这种算法对您来说会更好:

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)

答案 1 :(得分:1)

尽管此方法不是很可靠(例如,您可能会错过“汉堡”),但主要错误是您没有在迭代器上循环,而是在列表本身上循环。这是更正的版本。

请注意,我重命名了变量以赋予它们更具表达性的名称,并用示例词汇表将简单的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