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

-2
FryMan 7 mars 2016 à 10:17

5 réponses

Meilleure réponse

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]]
2
3 revs, 3 users 80%user6022341 7 mars 2016 à 07:52

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.
1
Goodies 7 mars 2016 à 07:24

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

0
Chuck Logan Lim 7 mars 2016 à 07:35

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]
0
heemayl 7 mars 2016 à 07:29

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.

4
Alexander 7 mars 2016 à 07:33