如何在python中替换多个字符串?

时间:2018-03-24 13:44:17

标签: python python-2.7

我正在尝试替换列表中的多个字符串,但是我不尽如人意。我要替换的字符串是。数字代表单词的正确顺序

sentence = ['1', '2', '3', '4']

我想用文字'i','put','this','here'替换数字,以便它看起来像下面

['i', 'put', 'this', 'here']

我找到了一行代码,只能替换一个单词。

newsentence = [n.replace('1', 'I') for n in sentence]

我尝试重复代码4次,以便替换所有数字。

newsentence = [n.replace('1', 'I') for n in sentence]
newsentence = [n.replace('2', 'put') for n in sentence]
newsentence = [n.replace('3', 'this') for n in sentence]
newsentence = [n.replace('4', 'here') for n in sentence]

但结果是执行了最后一次替换

['1', '2', '3', 'here']

感谢您的反馈

4 个答案:

答案 0 :(得分:3)

看起来你知道需要替换哪些词。使用以下方法将在O(n)时间内完成。

changes = {
    '1': 'i',
    '2': 'put',
    '3': 'this',
    '4': 'here'
}

sentence = ['1', '2', '3', '4']

newsentence = []
for word in sentence:
    try:
        newsentence.append(changes[word])
    except KeyError:
        newsentence.append(word)

print(newsentence)
# ['i', 'put', 'this', 'here']

<强>解释

您在这里要做的是检查字典中是否有列表项。如果可用,请使用它的值并将该值附加到新列表中。否则,直接附加旧列表的值。

如果密钥在字典中不可用,则行changes[word]中的代码newsentence.append(changes[word])将引发KeyError。这就是我们捕获该错误并直接附加该词的原因。

另请注意,此代码使用EAFP principle

注意:以下代码仅显示您出错的位置。避免使用它(原因如下)。

为了帮助您了解代码中发生的情况,请查看以下代码段:

>>> sentence = ['1', '2', '3', '4']
>>> newsentence = [n.replace('1', 'I') for n in sentence]
>>> newsentence
['I', '2', '3', '4']
>>> newsentence = [n.replace('2', 'put') for n in sentence]
>>> newsentence
['1', 'put', '3', '4']
>>> newsentence = [n.replace('3', 'this') for n in sentence]
>>> newsentence
['1', '2', 'this', '4']
...

简而言之,您要从原始句子中替换单个项目,即每次['1', '2', '3', '4']。要替换所有项目,请在第一个替换行后将sentence替换为newsentence

sentence = ['1', '2', '3', '4']

newsentence = [n.replace('1', 'I') for n in sentence]
newsentence = [n.replace('2', 'put') for n in newsentence]
newsentence = [n.replace('3', 'this') for n in newsentence]
newsentence = [n.replace('4', 'here') for n in newsentence]

print(newsentence)
# ['I', 'put', 'this', 'here']

但是,避免此代码,因为成本是二次的;或者更准确地说,O(m*n) m是列表的大小,n是您要替换的单词数;显然,如果列表更大,写这个是不可行的。

答案 1 :(得分:3)

请参阅@KeyurPotdar的answer,了解原始解决方案无效的原因。

对于基于列表理解的问题解决方案(看起来你就是这样),你可以创建输入到输出的映射,然后用输入迭代映射

sSql = "SELECT login_password FROM Login WHERE login_username = '" & txtUsername.Text & "';"

这很好,但是如果您决定在mapping = { '1': 'i', '2': 'put', '3': 'this', '4': 'here', } sentence = ['1', '2', '3', '4'] newsentence = [mapping[word] for word in sentence] # ['I', 'put', 'this', 'here'] 处投入更多输入,而您尚未定义输出,则会获得mapping。要轻松处理此问题,您可以使用dict.get,这样您就可以提供在缺少给定密钥时返回的回退值。

KeyError

A good reference on dict.get.

在这种情况下,不仅基于映射的解决方案更有效(请参阅@ KeyurPotdar关于此的说明),但将代码分为数据和逻辑是正确的事情。

如果您可以将基于代码/逻辑的问题(例如原始问题中的列表推导序列)转换为基于映射的问题,那么您几乎总能在可维护性和代码清晰度方面获胜。注意这个解决方案数据和逻辑都是混合的:

newsentence = [mapping.get(word, word) for word in sentence]
# ['I', 'put', 'this', 'here']

但是,在基于映射的解决方案中,它们是分开的

newsentence = [n.replace('1', 'I') for n in sentence]
newsentence = [n.replace('2', 'put') for n in newsentence]
newsentence = [n.replace('3', 'this') for n in newsentence]
newsentence = [n.replace('4', 'here') for n in newsentence]

这会给你带来什么?假设你不得不支持映射1000个单词,这些单词经常变化。将单词与逻辑混合使得查找更具挑战性,并且如果更改只会影响数据或者也可能意外地更改控制流,则会更难以在精神上解耦。使用基于映射的解决方案,可以肯定的是,更改仅影响数据。

请考虑我们需要添加# DATA mapping = { '1': 'i', '2': 'put', '3': 'this', '4': 'here', } # LOGIC newsentence = [mapping.get(word, word) for word in sentence] '1a'的映射。在混合逻辑/数据示例中,很容易错过将'we'更改为sentence

newsentence

糟糕!在基于映射的示例中,这种类型的错误是不可能的。

此外,通过从逻辑中分离数据,可以开始将数据存储在单独的文件中(例如JSON或YAML)。这使得版本控制更加简单。然后,它开启了用户可自定义的映射的可能性,您不必将其硬编码到脚本中。解耦==很好。

答案 2 :(得分:0)

你可以这样做:

carManager.execute("buyVehicle", "Ford Escort", "453543")

这意味着每次都会更改前一个,而不是恢复到原来的,然后只进行一次替换。 您也可以使用newsentence = [n.replace('1', 'I') for n in sentence] newsentence = [n.replace('2', 'put') for n in newsentence] newsentence = [n.replace('3', 'this') for n in newsentence] newsentence = [n.replace('4', 'here') for n in newsentence]

format()

有关sentence='{1}{2}{3}{4}{5}' sentence.format('I', 'put', 'this', 'here') 功能的更多信息,请参阅this page

答案 3 :(得分:0)

有一种翻译方法,您可以通过该方法进行多次替换

s = '1 2 3 4'
replaced_string = s.translate(str.maketrans({'1': 'I', '2': 'put', '3': 'this', '4': 'here'}))
print(replaced_string)

#output: I put this here

您可以通过这种方式避免嵌套的replace语句 干杯!