4

我有一组有时无效的字符串,我想用更好的字符串替换它们。我一直在玩 functools 和 itertools 并想尝试将它们应用于问题,但我有点卡住了。这是我所拥有的:

s1 = 'how to sing songs'
s2 = 'This is junk'
s3 = "This is gold"
s4 = 'HTML'
s5 = 'html'
s6 = 'i'
mylist = [s1,s2,s3,s4,s5,s6]

replacements = [('html','HTML'),('how to sing songs','singing'),('This is junk', ''),('i','')]

我想要一个函数算法,对于 mylist 中的每个字符串,对于替换中的每个替换,string.replace(replacement[0],replacement[1])。

想到了什么,比如……

map(lambda x,y: x.replace(y[0],y[1]),mylist,replacements)
map(partial(lambda x,y: x.replace(y[0],y[1]),mylist),replacements)

但是第一个需要额外的参数,第二个说列表对象没有属性替换。有没有一种巧妙的实用方法来解决这个问题?

4

2 回答 2

4
>>> [reduce(lambda x, y: x.replace(y[0], y[1]), replacements, s) for s in mylist]
['singing', '', 'This is gold', 'HTML', 'HTML']

等效代码,map()而不是列表理解:

map(partial(reduce, lambda x, y: x.replace(y[0], y[1]), replacements), mylist)
于 2013-04-16T21:34:30.447 回答
-1

听起来你想要一些非常快的东西。在这种情况下,您真的应该使用字典,因为查找速度非常快。

一个工作示例:

mylist = ['how to sing songs', 'This is junk', "This is gold", 'HTML', 'html', 'i']
replacements = {'html':'HTML', 'how to sing songs':'singing', 'This is junk':'', 'i':''}

print [replacements.get(word, word) for word in mylist]  
# ['singing', '', 'This is gold', 'HTML', 'HTML', ''] 
于 2013-04-16T22:24:14.200 回答