将字符串替换字典应用于字符串列表

时间:2014-04-28 14:25:11

标签: python

假设我有一个字符串列表和一个指定替换词的字典:

E.g。

my_replacements = {'1/2': 'half', '1/4': 'quarter', '3/4': 'three quarters'}

和一个字符串列表,其中每个字符串可能包含来自上述字典的键,例如:

['I own 1/2 bottle', 'Give me 3/4 of the profit']

如何将替换应用于列表?什么是Pythonic的方法呢?

6 个答案:

答案 0 :(得分:4)

O(n)解决方案:

reps = {'1/2': 'half', '1/4': 'quarter', '3/4': 'three quarters'}
li = ['I own 1/2 bottle', 'Give me 3/4 of the profit']

map(lambda s: ' '.join([reps.get(w,w) for w in s.split()]),li)
Out[6]: ['I own half bottle', 'Give me three quarters of the profit']

#for those who don't like `map`, the list comp version:
[' '.join([reps.get(w,w) for w in sentence.split()]) for sentence in li]
Out[9]: ['I own half bottle', 'Give me three quarters of the profit']

在循环中进行大量replace调用的问题在于它使您的算法成为O(n ** 2)。当你有一个长度为3的替换词典时没什么大不了的,但是当它变大时,突然你会有一个非常慢的算法,而且不需要。

正如评论中所指出的,这种方法从根本上取决于能否基于空格进行标记化 - 因此,如果您的替换键中有任何空格(比如说,您想要替换一系列单词),这种方法将无效。然而,能够替换单词是一种比需要替换词组更频繁的操作,因此我不同意那些认为这种方法不够通用的评论者。

答案 1 :(得分:3)

a = ['I own 1/2 bottle', 'Give me 3/4 of the profit']
b = {'1/2': 'half', '1/4': 'quarter', '3/4': 'three quarters'}

def replace(x):
    for what, new in b.items(): # or iteritems in Python 2
        x = x.replace(what, new)
    return x

print(list(map(replace, a)))

输出:

['I own half bottle', 'Give me three quarters of the profit']

答案 2 :(得分:3)

我使用这样的东西:

def replace_all(replacements, s):
    for old, new in replacements.items():
        s = s.replace(old, new)
    return s

my_replacements = {'1/2': 'half', '1/4': 'quarter', '3/4': 'three quarters'}
strings = ['I own 1/2 bottle', 'Give me 3/4 of the profit']

print ", ".join(replace_all(my_replacements, x) for x in strings)

<强>输出:

I own half bottle, Give me three quarters of the profit

答案 3 :(得分:2)

如果您希望列表中的字符串具有多个匹配项并且正在为大型列表或许多列表执行my_replacements的替换,那么构造模式并使用{{1}可能是有意义的}}。与user2931409不同,以下解决方案不需要任何特殊的替换结构,并且它应该至少与roippi的解决方案一样好,因为它不会对输入字符串进行多次传递:

re.sub

答案 4 :(得分:1)

使用re.sub

import re

my_replacements = {'1/2': 'half', '1/4': 'quarter', '3/4': 'three quarters'}
strings = ['I own 1/2 bottle', 'Give me 3/4 of the profit']

print [re.sub(r'\d/\d', lambda x: my_replacements[x.group()], string) for string in strings]

输出:

['I own half bottle', 'Give me three quarters of the profit']

答案 5 :(得分:0)

我使用了基于字典的格式化表达式

文档: https://docs.python.org/2/library/string.html#format-examples

my_replacements = {'1/2': 'half', '1/4': 'quarter', '3/4': 'three quarters'}
c = 'I own %(1/2)s bottle, Give me %(3/4)s of the profit' % my_replacements
print(c)
# I own half bottle, Give me three quarters of the profit