我有一个清单
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']
它没有改变,有什么问题?
答案 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
[ 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))