更改列表中的多个字符串

时间:2017-11-16 17:09:57

标签: python

我有一个清单

task_list = ['A1.wakeup', 'A2.brush','B1.route','B2.breakfast']

我想要的结果是

task_list = ['1A1.wakeup', '1A2.brush','2B1.route','2B2.breakfast']

我使用for循环:

new_task_list = task_list[:]
for task in new_task_list:
    task.replace('A', '1A')
    task.replace('B','1B')

In [61]: new_task_list
Out[61]: ['A1.wakeup', 'A2.brush', 'B1.route', 'B2.breakfast']

它没有改变,有什么问题?

5 个答案:

答案 0 :(得分:1)

str.replace无法就地工作(双关语无意)。

您可以创建替换的映射,并使用列表推导来构建新的列表,从映射中查找值,并将这些值添加到每个字符串中:

mapping = {'A': '1', 'B': '2'}
new_list = [mapping[x[0]]+x for x in task_list]
print(new_list)
# ['1A1.wakeup', '1A2.brush', '2B1.route', '2B2.breakfast']

答案 1 :(得分:1)

从Moses Koledoye的回答中得到启示

task_list = ['A1.wakeup', 'A2.brush','B1.route','B2.breakfast']

获得A(= 65),B(= 66)和64

的ascii值的差异
[ str( ord(x[0]) - 64 )+x for x in task_list ]

# ['1A1.wakeup', '1A2.brush', '2B1.route', '2B2.breakfast']

答案 2 :(得分:0)

task循环中的

for只是每次循环迭代时更新的变量,task.replace('A', '1A')不会更改列表值 inplace 。< / p>

我建议使用re模块的以下解决方案:

import re

task_list = ['A1.wakeup', 'A2.brush','B1.route','B2.breakfast']
new_task_list = [ re.sub(r'^(A|B)', lambda m: ('1' if m.group(1) == 'A' else '2') + m.group(1), t)
                  for t in task_list]

print(new_task_list)

输出:

['1A1.wakeup', '1A2.brush', '2B1.route', '2B2.breakfast']

甚至更简单:

task_list = ['A1.wakeup', 'A2.brush','B1.route','B2.breakfast']
search = {'A':'1', 'B':'2'}
new_task_list = [ (search[t[0]] if t[0] in search else '') + t for t in task_list]
print(new_task_list)

答案 3 :(得分:0)

task_list = ['A1.wakeup', 'A2.brush','B1.route','B2.breakfast']
task_list = [w.replace('A', '1A') for w in task_list]
task_list = [w.replace('B', '2B') for w in task_list]

然后,你会得到

task_list = ['1A1.wakeup', '1A2.brush', '2B1.route', '2B2.breakfast']

答案 4 :(得分:0)

问题是python中的字符串是不可变的(它们不能改变),这就是为什么replace将返回一个新字符串(原始字符串将是相同的)。要做你想做的事,你可以试试:

new_task_list = task_list[:]
for idx, task in enumerate(new_task_list):
    new_task_list[idx] = new_task_list[idx].replace('A', '1A')
    new_task_list[idx] = new_task_list[idx].replace('B', '2B')

甚至:

from operator import methodcaller
new_task_list = map(methodcaller('replace', 'B', '2B'),
                map(methodcaller('replace', 'A', '1A'), task_list))