【问题标题】:Find and replace string values in list while looping循环时查找和替换列表中的字符串值
【发布时间】:2019-05-20 19:30:34
【问题描述】:

我有一个包含项目名称的列表(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']

感谢大家的帮助

【问题讨论】:

  • 其他答案很完美。但是,如果您只是在 for 循环 (new_kit_compon = cur_kit_compon[:]) 之前复制 cur_kit_compon 然后更改列表理解以从该新列表 (new_kit_compon = [y.replace(rmv_items[index], x) for y in new_kit_compon]) 中获取项目,则您的代码可以“工作”。这效率不高且不推荐,但它可能会帮助您理解为什么您的代码只替换了一项。

标签: python list-comprehension enumerate


【解决方案1】:

您可以构建一个字典,将要删除的项目映射到它们的替换项,然后使用该字典查找列表中项目的替换项。

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']

【讨论】:

    【解决方案2】:

    您在 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)
    

    【讨论】:

    • 这仍然是 O(n**2),因为 index 必须在每个循环中查看列表。
    • 另外,如果rmv不在cur_kit_compon中,也会抛出ValueError
    【解决方案3】:

    为什么不简单地执行以下操作?如果想法是获取更新项目的列表

    add_items+[item for item in cur_kit_compon if item not in rmv_items]
    

    输出

    ['item22', 'item23', 'item03', 'item4', 'item5']
    

    【讨论】:

    • 那也行 - 谢谢!
    【解决方案4】:

    您正在替换 while 中的值,并将其保存到每个循环的新列表中。旧列表 (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']
    

    【讨论】:

      【解决方案5】:

      您可以遍历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
      

      【讨论】:

        猜你喜欢
        • 2011-03-09
        • 2017-09-30
        • 2017-05-13
        • 2019-10-23
        • 1970-01-01
        • 2020-01-03
        • 1970-01-01
        • 2016-01-20
        • 1970-01-01
        相关资源
        最近更新 更多