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>
5 Réponses :
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)
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
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']
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]
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
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]
Cela ira aussi - Merci!
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.