Considérez x = [10,10,20,20,20,30]
Comment puis-je former un autre list_x1
qui ne contient que les mêmes valeurs exemple: list_x1 = [10,10]
et list_x2 =[20,20]
et list_x3 =[30]
?
5 réponses
Avec itertools.groupby
>>> from itertools import groupby
>>> x = [10,10,20,20,20,30]
>>> [list(g) for k, g in groupby(x)]
[[10, 10], [20, 20, 20], [30]]
La meilleure façon est peut-être l'idée de @ Alexander avec les collections, mais je trouve toujours utile de regarder du code python plus «natif» pour voir ce qui se passe. Voici donc un moyen de le faire:
x = [10,10,20,20,20,30]
def foo(iterable):
for val in iterable:
cnt = iterable.count(val)
iterable = list(filter(lambda x: x != val, iterable))
if cnt:
yield [val]*cnt
for _ in foo(x):
print(_)
Notez que le facteur de complexité va être assez élevé. Certainement pas O (n) car il faut:
- Parcourez chacune des valeurs de notre
for val in iterable
principal - Itérer à travers chacune des valeurs chaque fois que nous appelons
iterable.count
- Parcourez chacune des valeurs lorsque nous les
filter()
pour éviter les doublons.
Ce n'est pas exactement ce que vous recherchez, mais ce code générera une liste de listes séparant les valeurs.
x = [10, 10, 20, 20, 20, 30]
uniques = set(x)
output = []
for unique in uniques:
unique_count = x.count(unique)
temp = []
for i in range(0, unique_count):
temp.append(unique)
output.append(temp)
Vous pouvez ensuite utiliser des listes de compréhension sur output
En utilisant collections.Counter
:
>>> def list_gen(in_list, elem):
... count = collections.Counter(in_list)
... return [elem] * count[elem]
...
>>> a
[1, 2, 3, 2, 3]
>>> list_gen(a, 2)
[2, 2]
Vous pouvez utiliser le compteur.
from collections import Counter
x = [10, 10, 20, 20, 20, 30]
my_counter = Counter(x)
d = {'list_x{0}'.format(key): [key] * my_counter[key] for key in my_counter}
>>> d
{'list_x10': [10, 10], 'list_x20': [20, 20, 20], 'list_x30': [30]}
L'un des problèmes de votre demande est que vous auriez besoin de pré-affecter des variables, qui ne sont pas initialement connues. J'ai utilisé un dictionnaire comme conteneur pour les contenir.
Pour une liste, [10] * 3 donne [10, 10, 10]. Ainsi, [k] * my_counter
multiplie la valeur de clé unique par le nombre d'occurrences.
Questions connexes
De nouvelles questions
python
Python est un langage de programmation multi-paradigme, typé dynamiquement et polyvalent. Il est conçu pour être rapide à apprendre, comprendre, utiliser et appliquer une syntaxe propre et uniforme. Veuillez noter que Python 2 est officiellement hors support à partir du 01-01-2020. Néanmoins, pour les questions Python spécifiques à la version, ajoutez la balise [python-2.7] ou [python-3.x]. Lorsque vous utilisez une variante Python (par exemple, Jython, PyPy) ou une bibliothèque (par exemple, Pandas et NumPy), veuillez l'inclure dans les balises.