J'ai une liste comme celle-ci lst = [1,3,5]
et une liste majeure comme lost =['the' , 'cat' , 'thinks' , 'you' , 'are' , 'crazy' ]
Je souhaite supprimer des éléments de la deuxième liste en fonction des index de la première. Cela signifie que je dois supprimer «chat», «vous» et «fou».
Le problème est si j'utilise:
lost.remove(lost[1]) lost.remove(lost[3]) lost.remove(lost[5])
Le premier problème est que ça ne marchera pas! Parce que lorsque nous supprimons le premier élément, la longueur de la liste ( nommée perdue ) diminue et de cette manière nous supprimerons les éléments incorrects.
Le deuxième problème est que la liste nommée ( lst ) ne sera pas toujours [1,3,5]. Cela va changer en longueur et en éléments.
Comment puis-je résoudre le problème?
7 Réponses :
Chaque fois que vous supprimez un élément de votre liste, par exemple selon lost [i], passez par lost de i à la fin et décrémentez toutes les valeurs de 1.
Et comment ferais-je cela avec python?
Vous pouvez le résoudre en utilisant la list comprehension
comme ci-dessous:
lst = [1,3,5] lost =['the' , 'cat' , 'thinks' , 'you' , 'are' , 'crazy' ] print([ val for idx, val in enumerate(lost) if idx not in lst])
Ce serait: ['the', 'thinks', 'are']
espoir vous aide
Votre solution fonctionne-t-elle spécifiquement parce qu'il s'agit d'une compréhension de liste ou une boucle for peut-elle fonctionner? Cela fonctionne-t-il parce qu'il crée une nouvelle liste au lieu de supprimer des éléments de l'original?
Cela fonctionnera également avec une for loop
, mais vous pouvez le résoudre dans un code à une ligne. La raison principale est que lorsque vous voulez supprimer des éléments par leur index, vous allez avoir des problèmes car la liste de longueur change à chaque fois
Vous ne créez pas une liste avec {}
, mais un ensemble. Si vous souhaitez créer une liste, vous devez utiliser les caractères []
. Après cela, vous pouvez supprimer les éléments de la liste comme suit:
indexes = {1,3,5} lst = ['the' , 'cat' , 'thinks' , 'you' , 'are' , 'crazy'] lst_dct = dict(enumerate(lst)) for index in indexes: lst_dct.pop(index) new_lst = list(lst_dct.values())
Le new_lst
contiendra désormais les éléments restants.
De plus, au lieu de la fonction remove
, qui nécessite un élément, vous devez utiliser pop
pour supprimer et élément d'une liste basée sur l'index.
Votre solution souffre du même problème que l'OP tente de résoudre.
@wwii Vous avez raison, j'ai changé ma réponse en conséquence
Vous pouvez également utiliser la compréhension de liste avec condition.
lst = [1,3,5] lost =['the' , 'cat' , 'thinks' , 'you' , 'are' , 'crazy' ] copy_list=[lost[i] for i in range(len(lost)) if not i in lst]
Pouvez-vous le faire avec une boucle for ou cela fonctionne-t-il spécifiquement parce que c'est une compréhension de liste?
@wwii Cela pourrait aussi fonctionner pour une boucle, ce serait plus long à écrire! La compréhension de liste dans la couche sous-jacente implémente la boucle et rend le code lisible.
Comme @ np8 l'a commenté , vous pouvez supprimer les éléments dans l' ordre d'index décroissant comme suit:
lst = [3, 1, 5] lost = ['the', 'cat', 'thinks', 'you', 'are', 'crazy'] for index in sorted(lst, reverse=True): # descending index order del lost[index]
qui imprime
['the', 'thinks', 'are']
MISE À JOUR (Merci à @wwii pour le commentaire )
Si le lst
donné n'est pas trié par ordre croissant, vous pouvez faire comme suit à la place:
lst = [1, 3, 5] lost = ['the', 'cat', 'thinks', 'you', 'are', 'crazy'] for index in reversed(lst): # descending index order del lost[index] print(lost)
Et si lst = [3,1,5]
?
@wwii lol, je n'y ai même pas pensé! Merci pour votre commentaire! Ensuite, for index in sorted(lst, reverse=True): del lost[index]
peut être utilisé à la place.
@wwii J'ai mis à jour mon message. Merci encore!
Si l'espace n'est pas un problème, vous pouvez utiliser ceci:
['the', 'thinks', 'are']
production:
import numpy as np lst = [1, 3, 5] lost =['the' , 'cat' , 'thinks' , 'you' , 'are' , 'crazy' ] output = np.delete(lost, lst).tolist() print(output)
Faire une boucle sur les index Ajouter ceux qui ne sont pas obligatoires
new = [lost[i] for i in range(len(lost)) if i not in lst]
Mieux: utilisez enumerate
comme ceci: new = [word for index, word in enumerate(lost) if index not in lst]
. Si lst
est gros, vous voudrez peut-être en créer un set
pour accélérer les choses.
Supprimez les éléments par ordre décroissant d' index: 5, 3, 1