循环时查找并替换列表中的字符串值
Find and replace string values in list while looping
我有一个包含项目名称的列表(item01、item02 等)
我想删除一些旧项目并在列表中添加新项目
我试过这段代码:
add_items = 'item22,item23'.split(',')
rmv_items = 'item01,item02'.split(',')
cur_kit_compon = ['item01', 'item02', 'item03', 'item4', 'item5']
for index, x in enumerate(add_items):
new_kit_compon = [y.replace(rmv_items[index], x) for y in cur_kit_compon]
print('-------------------------')
print(new_kit_compon)
代码输出:
['item01', 'item23', 'item03', 'item4', 'item5']
问题:
该代码仅删除和添加 1 个项目而不是 2 个项目
期望的输出:
['item22', 'item23', 'item03', 'item4', 'item5']
感谢大家的帮助
您在每次循环将其保存到新列表的同时替换其中的值。旧列表 (cur_kit_compon
) 保持不变。例如:
add_items = 'item22,item23'.split(',')
rmv_items = 'item01,item02'.split(',')
cur_kit_compon = ['item01', 'item02', 'item03', 'item4', 'item5']
for index, x in enumerate(add_items):
new_kit_compon = [y.replace(rmv_items[index], x) for y in cur_kit_compon]
print('cur_kit_compon: ', cur_kit_compon)
结果:
print('-------------------------')
print(new_kit_compon)
cur_kit_compon: ['item01', 'item02', 'item03', 'item4', 'item5']
cur_kit_compon: ['item01', 'item02', 'item03', 'item4', 'item5']
-------------------------
['item01', 'item23', 'item03', 'item4', 'item5']
您可以遍历 cur_kit_compon
并根据 add_items/rmv_items
找到的索引替换项目:
add_items = 'item22,item23'.split(',')
rmv_items = 'item01,item02'.split(',')
cur_kit_compon = ['item01', 'item02', 'item03', 'item4', 'item5']
for index, item in enumerate(cur_kit_compon):
if item in rmv_items:
i = rmv_items.index(item)
cur_kit_compon[index] = add_items[i]
cur_kit_compon
您可以构建一个字典,将要删除的项目映射到它们的替换项,然后使用该字典查找列表中项目的替换项。
add_items = 'item22,item23'.split(',')
rmv_items = 'item01,item02'.split(',')
replacements = dict(zip(rmv_items, add_items))
cur_kit_compon = ['item01', 'item02', 'item03', 'item4', 'item5']
res = [replacements.get(item, item) for item in cur_kit_compon]
# ['item22', 'item23', 'item03', 'item4', 'item5']
你在 for
循环中嵌套了一个列表理解,而没有理由这样做。而不是
for index, x in enumerate(add_items):
new_kit_compon = [y.replace(rmv_items[index], x) for y in cur_kit_compon]
就这样
new_kit_compon = cur_kit_compon[:] # create a copy of original list, so as not to modify it
for add, rmv in zip(add_items, rmv_items): # go through the added and removed items together
idx = new_kit_compon.index(rmv) # find the index of the item to replace
new_kit_compon[idx] = add # replace it
print(new_kit_compon)
为什么不简单地执行以下操作?如果想法是获取包含更新项目的列表
add_items+[item for item in cur_kit_compon if item not in rmv_items]
输出
['item22', 'item23', 'item03', 'item4', 'item5']
我有一个包含项目名称的列表(item01、item02 等) 我想删除一些旧项目并在列表中添加新项目
我试过这段代码:
add_items = 'item22,item23'.split(',')
rmv_items = 'item01,item02'.split(',')
cur_kit_compon = ['item01', 'item02', 'item03', 'item4', 'item5']
for index, x in enumerate(add_items):
new_kit_compon = [y.replace(rmv_items[index], x) for y in cur_kit_compon]
print('-------------------------')
print(new_kit_compon)
代码输出:
['item01', 'item23', 'item03', 'item4', 'item5']
问题: 该代码仅删除和添加 1 个项目而不是 2 个项目
期望的输出:
['item22', 'item23', 'item03', 'item4', 'item5']
感谢大家的帮助
您在每次循环将其保存到新列表的同时替换其中的值。旧列表 (cur_kit_compon
) 保持不变。例如:
add_items = 'item22,item23'.split(',')
rmv_items = 'item01,item02'.split(',')
cur_kit_compon = ['item01', 'item02', 'item03', 'item4', 'item5']
for index, x in enumerate(add_items):
new_kit_compon = [y.replace(rmv_items[index], x) for y in cur_kit_compon]
print('cur_kit_compon: ', cur_kit_compon)
结果:
print('-------------------------')
print(new_kit_compon)
cur_kit_compon: ['item01', 'item02', 'item03', 'item4', 'item5']
cur_kit_compon: ['item01', 'item02', 'item03', 'item4', 'item5']
-------------------------
['item01', 'item23', 'item03', 'item4', 'item5']
您可以遍历 cur_kit_compon
并根据 add_items/rmv_items
找到的索引替换项目:
add_items = 'item22,item23'.split(',')
rmv_items = 'item01,item02'.split(',')
cur_kit_compon = ['item01', 'item02', 'item03', 'item4', 'item5']
for index, item in enumerate(cur_kit_compon):
if item in rmv_items:
i = rmv_items.index(item)
cur_kit_compon[index] = add_items[i]
cur_kit_compon
您可以构建一个字典,将要删除的项目映射到它们的替换项,然后使用该字典查找列表中项目的替换项。
add_items = 'item22,item23'.split(',')
rmv_items = 'item01,item02'.split(',')
replacements = dict(zip(rmv_items, add_items))
cur_kit_compon = ['item01', 'item02', 'item03', 'item4', 'item5']
res = [replacements.get(item, item) for item in cur_kit_compon]
# ['item22', 'item23', 'item03', 'item4', 'item5']
你在 for
循环中嵌套了一个列表理解,而没有理由这样做。而不是
for index, x in enumerate(add_items):
new_kit_compon = [y.replace(rmv_items[index], x) for y in cur_kit_compon]
就这样
new_kit_compon = cur_kit_compon[:] # create a copy of original list, so as not to modify it
for add, rmv in zip(add_items, rmv_items): # go through the added and removed items together
idx = new_kit_compon.index(rmv) # find the index of the item to replace
new_kit_compon[idx] = add # replace it
print(new_kit_compon)
为什么不简单地执行以下操作?如果想法是获取包含更新项目的列表
add_items+[item for item in cur_kit_compon if item not in rmv_items]
输出
['item22', 'item23', 'item03', 'item4', 'item5']