Найти и заменить строковые значения в списке во время цикла - PullRequest
1 голос
/ 20 мая 2019

У меня есть список, содержащий названия элементов (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']

Спасибо за вашу помощь

Ответы [ 5 ]

4 голосов
/ 20 мая 2019

Вы можете создать словарь, отображающий элементы, которые необходимо удалить, и заменить их, а затем использовать этот словарь, чтобы найти замены для элементов в вашем списке.

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']
1 голос
/ 20 мая 2019

Почему бы просто не сделать следующее?Если идея состоит в том, чтобы получить список с обновленными элементами

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

Вывод

['item22', 'item23', 'item03', 'item4', 'item5']
1 голос
/ 20 мая 2019

Вы вкладываете понимание списка в цикл 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)
0 голосов
/ 20 мая 2019

Вы можете перебирать 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
0 голосов
/ 20 мая 2019

Вы заменяете значения из списка, сохраняя его в новом списке каждый цикл.Старый список (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']
...