1
votes

Diviser la liste de chaînes en plusieurs sous-listes si elles sont identiques

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


1 commentaires

6 Réponses :


1
votes

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']]


1 commentaires

Merci beaucoup pour l'aide



1
votes

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']]


0 commentaires

1
votes

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.


0 commentaires

1
votes

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)


0 commentaires

1
votes

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']]


0 commentaires

0
votes

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()])


0 commentaires