使用字典替换列表中的数字

时间:2017-12-05 16:32:08

标签: python dictionary replace

我正在尝试使用字典来替换字符串中的最后一位数字。我将元素提取到列表中,替换,然后将列表连接回字符串。代码运行但它只替换字典中的第二个元素。

text = "foo 123 doo 342 ghh 568 loo 243"
s = re.split(r'(\d+)', text)
textDict = {"2$":"fg" , "3$":"gh", "8$":"hj"}
for key in textDict:
    t = [re.sub(key , textDict[key], x) for x in s]
u = ["".join(t)]
u = str(u)
print u

我期待以下输入

foo 12gh doo 34fg ghh 56hj loo 24gh

但我现在正在

foo 12gh doo 342 ghh 568 loo 24gh

稍微扩展一下问题:

如果我想更改两个最后一位数字,那么我无法使这两种解决方案都无法正常工作。它们都返回原始字符串:

import re

text = "foo 123 doo 342 ghh 568 loo 243"
textDict = {"23":"fg" , "43":"gh", "68":"hj"}

使用解决方案#1:

s = re.split(r'(\d+)', text)
for i in range(len(s) - 2):
  s[i] = s[i][:-2] + textDict[s[i][-2]] if s[i][-2] in textDict else s[i]

u = "".join(s)
print u

使用解决方案#2:

result_str = ''
for txt in text.split(' '):
    if txt.isdigit() is True:
        txt = txt[:-2] + textDict.get(txt[-2], txt[-2])
    result_str += (txt + ' ')

result_str.strip()    

2 个答案:

答案 0 :(得分:3)

此解决方案无需使用re即可运行。我修改了您的textDict

In [19]: text = "foo 123 doo 342 ghh 568 loo 243"

In [20]: textDict = {"2":"fg" , "3":"gh", "8":"hj"} # modified textDict

In [21]: result_str = ''

In [22]: c_len = 1 # just modify this according to length of dict key

In [23]: for txt in text.split(' '):
    ...:     if txt.isdigit() is True:
    ...:         txt = txt[:-c_len] + textDict.get(txt[-c_len:], txt[-c_len:])
    ...:     result_str += (txt + ' ')
    ...:

In [24]: result_str.strip()    # to remove last space
Out[24]: 'foo 12gh doo 34fg ghh 56hj loo 24gh '

要回答您的问题,只需根据dict密钥长度修改c_len

答案 1 :(得分:2)

这样做的一种方法是扭转你的for循环。您可以迭代文本片段,而不是遍历您的键。我认为您不需要使用正则表达式,因为您有一个非常具体的案例。

create sequence SEQ start with 1 increment by 1

这给出了以下输出:

import re

text = "foo 123 doo 342 ghh 568 loo 243"
s = re.split(r'(\d+)', text)

textDict = {"2":"fg" , "3":"gh", "8":"hj"}
for i in range(len(s) - 1):
  s[i] = s[i][:-1] + textDict[s[i][-1]] if str(s[i][-1]) in textDict else s[i]

u = "".join(s)
u = str(u)
print u

我相信这也更有效率,因为不是有两个嵌套循环(这给我们> foo 12gh doo 34fg ghh 56hj loo 24gh 的顺序复杂化),你迭代一个列表,这给了我们O(n*m)。< / p>