J'ai deux listes :
big_list = [2, 1, 2, 3, 1, 2, 4]
sub_list = [1, 2]
Je veux supprimer toutes les occurrences de sub_list dans big_list.
Le résultat devrait être [2, 3, 4]
Pour les chaînes de caractères, vous pouvez utiliser ceci :
'2123124'.replace('12', '')
Mais AFAIK, cela ne fonctionne pas pour les listes.
Il ne s'agit pas d'un doublon de Suppression d'une sous-liste d'une liste puisque je veux supprimer toutes les sous-listes de la grande liste. Dans l'autre question, le résultat devrait être [5,6,7,1,2,3,4]
.
Mise à jour : Pour simplifier, j'ai pris des entiers dans cet exemple. Mais les éléments de la liste pourraient être des objets arbitraires.
Mise à jour2 :
si big_list = [1, 2, 1, 2, 1]
y sub_list = [1, 2, 1]
, Je veux que le résultat soit [2, 1]
(comme '12121'.replace('121', '')
)
Mise à jour3 :
Je n'aime pas copier et coller le code source de StackOverflow dans mon code. C'est pourquoi j'ai créé une deuxième question à software-recommendations : https://softwarerecs.stackexchange.com/questions/51273/library-to-remove-every-occurrence-of-sub-list-from-list-python
Mise à jour 4 : si vous connaissez une bibliothèque permettant de faire cet appel de méthode unique, veuillez l'écrire comme réponse, car c'est ma solution préférée.
Le test doit réussir ce test :
def test_remove_sub_list(self):
self.assertEqual([1, 2, 3], remove_sub_list([1, 2, 3], []))
self.assertEqual([1, 2, 3], remove_sub_list([1, 2, 3], [4]))
self.assertEqual([1, 3], remove_sub_list([1, 2, 3], [2]))
self.assertEqual([1, 2], remove_sub_list([1, 1, 2, 2], [1, 2]))
self.assertEquals([2, 1], remove_sub_list([1, 2, 1, 2, 1], [1, 2, 1]))
self.assertEqual([], remove_sub_list([1, 2, 1, 2, 1, 2], [1, 2]))
2 votes
Duplicata possible de Suppression d'une sous-liste d'une liste
1 votes
Si vous n'avez que des entiers dans la liste, vous pouvez procéder à une conversion en chaînes de caractères :
list(map(int, (''.join(map(str, big_list)).replace(''.join(map(str, sub_list)), ''))))
. Ou voulez-vous appliquer cela à des objets arbitraires ?2 votes
Juste pour clarifier, si vous avez
big_list = [1, 2, 1, 2, 1]
ysub_list = [1, 2, 1]
voulez-vous que le résultat soit[2, 1]
o[]
(c'est-à-dire supprimer par occurrence ou supprimer tous les éléments qui correspondent à l'élémentsub_list
) ?0 votes
@a_guest J'ai mis à jour la question.
0 votes
Juste par curiosité, sans vouloir vous offenser, pourquoi votre rep 3.6k alors que vous avez une réponse avec 450+ upvotes....
2 votes
@Marcus.Aurelianus Probablement parce que la plupart des votes positifs sur cette réponse se sont produits sur quelques jours : Stack Overflow a un plafond de réputation quotidien de 200. Ainsi, si plus de 20 personnes upvotent vos réponses dans les 24 heures, seules les 20 premières upvotations (×10 = 200 points) sont comptabilisées.
0 votes
@Konrad Rudolph, merci !
1 votes
La supposition de @Marcus.Aurelianus Konrad est incorrecte. La vérité est qu'OP dépense la plupart de sa réputation sur les primes - stackoverflow.com/users/633961/guettli?tab=bounties
0 votes
Leon Oh, très cool. Chapeau à l'OP. Je devrais le faire beaucoup plus souvent, j'oublie toujours.
0 votes
@Leon, programmeur génial, chapeau bas à OP.
1 votes
@guettli. Juste par curiosité, pourquoi avez-vous ajouté la prime ? Votre question a pas mal de réponses raisonnables, donc je me demande ce qui manque, ou ce que vous vous attendez à trouver.
0 votes
@MadPhysicist J'ai donné la prime, car j'aimerais avoir un one-liner. J'aime les bibliothèques.
2 votes
@guettli. Pourquoi ne pas coller une fonction dans votre bibliothèque et l'utiliser comme one liner ?
0 votes
@MadPhysicist J'aime réutiliser les logiciels. Et je pense toujours qu'une bibliothèque comme numpy a une méthode simple pour résoudre cette question.
0 votes
Numpy en particulier est un mauvais exemple pour deux raisons. La première est qu'il n'est pas fait pour ce genre de choses, et la deuxième est qu'il y a beaucoup d'exemples de code python qui ne font qu'envelopper un tas de fonctions C juste pour avoir une ligne unique.
1 votes
D'autre part, votre question devient de plus en plus hors sujet pour l'OS, malgré la prime.
4 votes
Enfin, l'affirmation "J'aime réutiliser les logiciels" est au mieux spécieuse, étant donné tout ce que vous avez dit par ailleurs. Il n'y a rien qui vous empêche de réutiliser le logiciel à part une contrainte complètement artificielle que vous avez imposée.
2 votes
S'il existe une bibliothèque externe pour résoudre ce problème, exigeriez-vous une solution optimisée écrite en C, ou accepteriez-vous quelque chose d'implémenté en Python ? Dans ce dernier cas, je pourrais simplement télécharger ma solution sur GitHub avec un fichier setup.py et l'appeler une bibliothèque.
0 votes
"Je n'aime pas copier+coller le code source de StackOverflow dans mon code". C'est entièrement une question de goût. Moi, d'un autre côté, ça ne me dérange vraiment pas. En fait, j'ai quelques fichiers de recettes de SO, qui ont été écrits par les mêmes personnes que les bibliothèques que j'utilise. Cela inclut numpy, matplotlib, python-docx et même python lui-même.