【问题标题】:Replace word in list with another用另一个替换列表中的单词
【发布时间】:2014-05-29 03:07:34
【问题描述】:

我有一个程序,它接收一个句子并将每个单词分成一个称为“单词”的列表。这看起来像我输入了一个像“我爱奶牛”这样的句子,程序会将它分成“单词”列表。该列表将类似于words = ['i','hate','cows']。我把那部分记下来了,但我希望能够用“你”之类的其他词代替“我”之类的词。这是我要开始工作的一段代码:

def word_identify(words):
parts_of_speech = []
for word in words:
    if word == 'help':
        help_info(help)
    if word == '?':            
        print "This is a question."
        return 12
    elif word == 'why':
        print "This is a question!"
        return 12
    elif word  == 'am':
        word = 'are'
        return 10
    elif word == 'i':
        word = ' you'
        return 10
    else:
        #new_words.append(word)
        return 1 

任何帮助将不胜感激。回报只需要我忽略,它们会触发程序的另一部分。我希望用新单词更新列表“单词”。

非常感谢!!!

编辑 谢谢大家的回复!@Nammi 你很有帮助,但是如果你告诉我如何解决这个问题,如果它们都出现在列表中,那就只替换两者中的一个!非常感谢大家!

仍然存在的问题:

How are you? I am sad
Why are you am sad?
None
Am I sad
Why are are i sad? 
None

不要注意我处理过的双重“是”。

【问题讨论】:

  • 你用的是python 2还是python 3?

标签: python regex python-2.7 python-3.x


【解决方案1】:

可以使用列表推导,如下:

new = ['you' if word == 'i' else word for word in words]

运行如下:

>>> words = ['i','hate','cows']
>>> new = ['you' if word == 'i' else word for word in words]
>>> new
['you', 'hate', 'cows']
>>> 

或者,对于更详细的解决方案,

只需使用基本的for 循环:

words = ['i','hate','cows']
new = []
for i in words:
    if i == 'i':
        new.append('you')
    elif i == 'am':
        new.append('are')
    elif i == 'why' or i == '?':
        print "This is a question!"
    else:
        new.append(i)

运行如下:

>>> words = ['i','hate','cows']
>>> new = []
>>> for i in words:
...     if i == 'i':
...         new.append('you')
...     elif i == 'am':
...         new.append('are')
...     elif i == 'why' or i == '?':
...         print "This is a question!"
...     else:
...         new.append(i)
... 
>>> new
['you', 'hate', 'cows']
>>> 

【讨论】:

  • 这个是保持顺序还是添加到最后?
  • 这将维持秩序,因为for 循环从顶部开始。
  • 你的回答确实概括了我的。 +1
【解决方案2】:

使用map 函数非常简单

words = ['i','hate','cows']
new_words = map(lambda x: 'you' if x == 'i' else x, words)
print new_words  #prints ['you', 'hate', 'cows']

这个函数接受一个大小为 N 的输入列表并输出一个长度完全相同的列表。 lambda 函数将转换应用于输出数组的每个元素。

【讨论】:

    【解决方案3】:

    您可以按索引循环,而不是使用 for-in 循环。 使用其索引分配列表元素会用新值覆盖列表中的任何值。因此,您无需在进行更改后返回列表。

    for i in range(0, len(words)):
        if (words[i] == "i"):
            words[i] = "you"
        elif (words[i] == "am"):
            words[i] = "are"
    ....
    

    【讨论】:

    • 这会替换其中一个函数还是整个代码块?
    • 整个块。将它放在以“单词”为参数的函数中会很有帮助,但不是必需的。
    • 它只替换两个中的一个,而不是两个。知道为什么吗?
    • 好像只运行一次,不应该运行多次
    • 每个元素都访问一次,这不是你想要的吗?您需要在循环中添加每个案例,否则它只会检查“i”和“are”
    猜你喜欢
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 2019-06-24
    • 1970-01-01
    相关资源
    最近更新 更多