1
votes

Rechercher et remplacer des valeurs de chaîne dans la liste lors de la boucle

J'ai une liste qui contient les noms des éléments (item01, item02 etc.) Je voudrais supprimer certains des anciens éléments et ajouter de nouveaux éléments dans une liste

J'ai essayé ce code:

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

Sortie du code:

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

Le problème: Le code supprime et ajoute seulement 1 élément au lieu de 2 éléments

Résultat souhaité:

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)

Merci pour toute votre aide

p>


1 commentaires

D'autres réponses sont parfaites. Cependant, votre code peut "fonctionner" si vous copiez simplement cur_kit_compon avant votre boucle for ( new_kit_compon = cur_kit_compon [:] ) et modifiez ensuite votre compréhension de liste pour prendre des éléments de ce nouveau list ( new_kit_compon = [y.replace (rmv_items [index], x) pour y dans new_kit_compon] ). Ce n'est ni efficace ni recommandé, mais cela peut vous aider à comprendre pourquoi votre code ne remplaçait qu'un élément.


5 Réponses :


0
votes

Vous remplacez les valeurs du tout en l'enregistrant dans la nouvelle liste à chaque boucle. L'ancienne liste ( cur_kit_compon ) reste la même. Exemple :

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

résultat :

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)


0 commentaires

0
votes

Vous pouvez parcourir cur_kit_compon et remplacer les éléments en fonction des add_items / rmv_items indices trouvés:

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 commentaires

4
votes

Vous pouvez créer un dictionnaire associant les éléments à supprimer à leurs remplaçants, puis utiliser ce dictionnaire pour rechercher les éléments de remplacement des éléments de votre liste.

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


0 commentaires

1
votes

Vous imbriquez une compréhension de liste dans une boucle for , alors qu'il n'y a aucune raison de le faire. Au lieu de

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)

, faites simplement

for index, x in enumerate(add_items):
    new_kit_compon = [y.replace(rmv_items[index], x) for y in cur_kit_compon]


2 commentaires

C'est toujours O (n ** 2), car index doit parcourir la liste sur chaque boucle.


Également, lancera ValueError si rmv n'est pas dans cur_kit_compon



1
votes

Pourquoi ne pas simplement faire ce qui suit? Si l'idée est d'obtenir la liste des éléments mis à jour

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

Sortie

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


1 commentaires

Cela ira aussi - Merci!