Je me demandais s'il était possible en python de diviser une liste de chaînes en plusieurs sous-listes si elles sont la même chaîne. Par exemple:
Entrée:
['Red','Red'] ['Green','Green'] ['Yellow','Yellow'] ['Blue','Blue'] ['Purple']
Sortie:
['Red','Green','Yellow','Blue','Blue','Green','Red','Yellow','Purple']
J'en ai besoin pour pouvoir le faire avec des valeurs différentes à chaque fois.
Je ne peux penser qu'à comparer chaque chaîne à chaque offre et à l'ajouter à des listes différentes, mais s'il y a plus de 5 valeurs différentes, je ne pense pas que cela fonctionnerait.
J'espère que quelqu'un pourra vous aider
6 Réponses :
Vous pouvez utiliser itertools.groupby () code> facilement
from itertools import groupby values = ['Red','Green','Yellow','Blue','Blue','Green','Red','Yellow','Purple'] result = [list(v) for k,v in groupby(sorted(values))] print(result) # [['Blue', 'Blue'], ['Green', 'Green'], ['Purple'], ['Red', 'Red'], ['Yellow', 'Yellow']]
Merci beaucoup pour l'aide
Vous pouvez utiliser un Compteur pour regrouper des éléments, puis créer le résultat de sortie. Cela éviterait d'avoir à trier la liste d'entrée.
>>> from collections import Counter >>> c = Counter(l) >>> res = [[k]*v for k,v in c.items()] >>> res [['Red', 'Red'], ['Green', 'Green'], ['Yellow', 'Yellow'], ['Blue', 'Blue'], ['Purple']]
Essayez ceci, en utilisant un objet Counter :
from collections import Counter lst = ['Red','Green','Yellow','Blue','Blue','Green','Red','Yellow','Purple'] counter = Counter(lst) [[color] * num for color, num in counter.items()] => [['Blue', 'Blue'], ['Purple'], ['Green', 'Green'], ['Yellow', 'Yellow'], ['Red', 'Red']]
La réponse sera une liste de listes, où chaque couleur est répétée autant de fois qu'elle l'était dans la liste d'entrée d'origine.
Vous pouvez utiliser Counter () du module collections :
[['Red', 'Red'], ['Green', 'Green'], ['Yellow', 'Yellow'], ['Blue', 'Blue'], ['Purple']]
Sortie :
from collections import Counter lst = ['Red','Green','Yellow','Blue','Blue','Green','Red','Yellow','Purple'] c = Counter(lst) lsts = [[l]*c[l] for l in c] print(lsts)
Bien que les autres réponses soient correctes, voici une autre approche sans utiliser de package extérieur d'une manière simple et compréhensible -
['Red', 'Red'] ['Green', 'Green'] ['Yellow', 'Yellow'] ['Blue', 'Blue'] ['Purple']
Résultat:
lst= ['Red','Green','Yellow','Blue','Blue','Green','Red','Yellow','Purple']
dictionary = {}
# Same as in last example... just a more pythonic way of doing it
for i in lst :
dictionary[i]=dictionary.get(i,0)+1
for k in dictionary.keys():
elements = [k]*dictionary[k]
print(elements)
Ou, si vous ne voulez pas générer de liste 2D, vous pouvez directement imprimer la liste de chaque élément où ils se produisent leur nombre de fois respectivement -
[['Red', 'Red'], ['Green', 'Green'], ['Yellow', 'Yellow'], ['Blue', 'Blue'], ['Purple']]
Depuis Python 3.7, Counter hérite de la capacité de dict à se souvenir de l'ordre d'insertion, donc j'ai enfin une utilisation pour les éléments () méthode de Counter :
> python3 test.py [['Red', 'Red'], ['Green', 'Green'], ['Yellow', 'Yellow'], ['Blue', 'Blue'], ['Purple']] >
OUTPUT
from collections import Counter from itertools import islice array = ['Red', 'Green', 'Yellow', 'Blue', 'Blue', 'Green', 'Red', 'Yellow', 'Purple'] counter = Counter(array) elements = counter.elements() print([[*islice(elements, count)] for count in counter.values()])
Est-ce que cela répond à votre question? Comment faire Je trouve les doublons dans une liste et en crée une autre avec eux?