使用字典和replace()函数替换字符串中的单词的问题

时间:2014-08-07 00:55:29

标签: python dictionary replace string-formatting

说我有一个字典,一个字符串和该字符串中的单词列表。像这样:

the_dictionary={'mine': 'yours', 'I': 'you', 'yours': 'mine', 'you': 'I'}

the_string='I thought that was yours'

list_string=['I','thought','that','was','yours']

这是我的代码:

for word in list_string:            
        if word in the_dictionary:
            the_string=the_string.replace(word,the_dictionary[word],1)
print(the_string)

输入:我认为那是你的

输出:你以为那是我的

这里一切都很好,但如果我将输入更改为:

  

the_string ="那是我的,是#34;

输入:这是我的,是你的

输出:这是我的,是你的

没有任何变化。

显然这与它们是键值对这一事实有关,但我希望这可以通过某种方式解决。

我的问题:为什么会发生这种情况并且可以修复?

请记住,我仍然是一个初学者,如果你在解释它时可以假装我是孩子,我会很感激。

感谢您抽出时间/ wazus

2 个答案:

答案 0 :(得分:1)

问题是您每次都在replace上调用the_string,并且在使用可选参数调用时,replace会替换源字符串的第一次出现。

因此,当您第一次在mine中遇到list_string时,the_string会更改为That is yours that is yours。到目前为止,这是预期的。

但稍后,您会在yours中遇到list_string,并且您说the_string = the_string.replace('yours', 'mine', 1)。因此,yoursthe_string的第一次出现会被mine取代,这会将我们带回原始字符串。

这是修复它的一种方法:

In [78]: the_string="That is mine that is yours"

In [79]: the_dictionary={'mine': 'yours', 'I': 'you', 'yours': 'mine', 'you': 'I'}

In [80]: list_string = the_string.split()

In [81]: for i,word in enumerate(list_string):
    if word in the_dictionary:
        list_string[i] = the_dictionary[word]
   ....:         

In [82]: print(' '.join(list_string))
That is yours that is mine

答案 1 :(得分:1)

这是你的第二个例子中发生了什么。最初,你有:

the_string = "That is mine, that is yours"

你的脚本改变了第一个"我的#34;进入"你的"这给出了:

the_string = "That is yours, that is yours"

然后,当再次扫描字符串时,它会更改第一个"你的" (刚刚改变了!)回到"我的#34;再次给你原来的短语:

the_string = "That is mine, that is yours"
那么,那么:为什么第一个字符串没有这样做呢?因为它取决于你在字典中选择单词的顺序,并且没有办法决定。有时你会很幸运,它会工作,有时候不会。

首先,您要确保一旦更改了某个单词,它就不会再次更改。因此,从原始脚本的结构来看,更改列表比使用字符串更好。你枚举列表中的每个项目,如果项目在字典中KEYS(是的:你应该总是寻找键,而不是单词本身)你改变它。然后将列表更改为字符串:

the_dictionary = {'I': 'you', 'mine': 'yours','yours': 'mine', 'you': 'I'}

the_string1 = 'I thought that was yours'
the_string2 = 'That is mine that is yours'


list_string1 = ['I','thought','that','was','yours']
list_string2 = ['Thas','is','mine','thas','is','yours']


for i,word in enumerate(list_string1) :
    if word in the_dictionary.keys():
        list_string1[i] = the_dictionary[word]
the_string1 = "%s "*len(list_string1) % tuple(list_string1)

for i,word in enumerate(list_string2) :
    if word in the_dictionary.keys() :
        list_string2[i] = the_dictionary[word]
the_string2 = "%s "*len(list_string2) % tuple(list_string2)

print(the_string1)
print(the_string2)

我使用了enumerate(),这样可以更轻松地访问索引和列表项。 然后我用一个小技巧将列表更改回字符串。不确定这是最好的方式...... 当然,更好的方法是将所有内容包装到函数中。您甚至可以使用正则表达式模块将字符串更改为列表:

import re
the_string_list = re.findall(r'\w+',the_string)

希望它有所帮助!