说我有一个字典,一个字符串和该字符串中的单词列表。像这样:
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
答案 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)
。因此,yours
中the_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)
希望它有所帮助!