-2
votes

Comment puis-je supprimer des éléments d'une liste avec l'ordre de suppression?

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?


1 commentaires

Supprimez les éléments par ordre décroissant d' index: 5, 3, 1


7 Réponses :


0
votes

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.


1 commentaires

Et comment ferais-je cela avec python?



0
votes

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


2 commentaires

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



1
votes

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.


2 commentaires

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



0
votes

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]


2 commentaires

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.



1
votes

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)


3 commentaires

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!



0
votes

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)


0 commentaires

0
votes

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]
   




1 commentaires

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.