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_componavant 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.