web-dev-qa-db-fra.com

Python - Trouver les mêmes valeurs dans une liste et regrouper une nouvelle liste

Je suis coincé pour comprendre cela et je me demande si quelqu'un pourrait me diriger dans la bonne direction ...

De cette liste:

N = [1,2,2,3,3,3,4,4,4,4,5,5,5,5,5]

J'essaie de créer:

L = [[1],[2,2],[3,3,3],[4,4,4,4],[5,5,5,5,5]]

Toute valeur qui se révèle être identique est regroupée dans sa propre sous-liste . Voici ma tentative jusqu'à présent, je pense que je devrais utiliser une boucle while?

global n

n = [1,2,2,3,3,3,4,4,4,4,5,5,5,5,5] #Sorted list
l = [] #Empty list to append values to

def compare(val):
   """ This function receives index values
   from the n list (n[0] etc) """

   global valin
   valin = val

   global count
   count = 0

    for i in xrange(len(n)):
        if valin == n[count]: # If the input value i.e. n[x] == n[iteration]
            temp = valin, n[count]
             l.append(temp) #append the values to a new list
             count +=1
        else:
          count +=1


for x in xrange (len(n)):
    compare(n[x]) #pass the n[x] to compare function
16
Siii

Quelqu'un mentionne pour N=[1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 1] il obtiendra [[1], [2, 2], [3, 3, 3], [4, 4, 4, 4], [5, 5, 5, 5, 5], [1]]

En d'autres termes, lorsque les numéros de la liste ne sont pas en ordre ou qu'il s'agit d'une liste de désordre, elle n'est pas disponible.

J'ai donc une meilleure réponse pour résoudre ce problème.

from collections import Counter

N = [1,2,2,3,3,3,4,4,4,4,5,5,5,5,5]
C = Counter(N)

print [ [k,]*v for k,v in C.items()]
14
Burger King

Restez calme et utilisez itertools.groupby :

from itertools import groupby

N = [1,2,2,3,3,3,4,4,4,4,5,5,5,5,5]

print([list(j) for i, j in groupby(N)])

Sortie:

[[1], [2, 2], [3, 3, 3], [4, 4, 4, 4], [5, 5, 5, 5, 5]]

Note latérale: Empêchez l'utilisation de variable globale lorsque vous n'avez pas besoin de need to.

29
Sam Bruns

Vous pouvez utiliser itertools.groupby avec une compréhension de liste

>>> l =  [1,2,2,3,3,3,4,4,4,4,5,5,5,5,5]
>>> [list(v) for k,v in itertools.groupby(l)]
[[1], [2, 2], [3, 3, 3], [4, 4, 4, 4], [5, 5, 5, 5, 5]]

Ceci peut être affecté à la variable L comme dans 

L = [list(v) for k,v in itertools.groupby(l)]
4
Bhargav Rao

Vous compliquez trop cela.

Ce que vous voulez faire, c'est: pour chaque valeur, si elle est identique à la dernière valeur, ajoutez-la simplement à la liste des dernières valeurs; sinon, créez une nouvelle liste. Vous pouvez traduire cet anglais directement en Python:

new_list = []
for value in old_list:
    if new_list and new_list[-1][0] == value:
        new_list[-1].append(value)
    else:
        new_list.append([value])

Il existe même des moyens plus simples de procéder si vous souhaitez obtenir un peu plus d'abstraction, par exemple, en utilisant les fonctions de regroupement dans itertools. Mais cela devrait être facile à comprendre.


Si vous avez vraiment besoin de faire cela avec une boucle while, vous pouvez traduire n'importe quelle boucle for en une boucle while comme ceci:

for value in iterable:
    do_stuff(value)

iterator = iter(iterable)
while True:
    try:
        value = next(iterator)
    except StopIteration:
        break
    do_stuff(value)

Ou, si vous savez que l'itérable est une séquence, vous pouvez utiliser une boucle while légèrement plus simple:

index = 0
while index < len(sequence):
    value = sequence[index]
    do_stuff(value)
    index += 1

Mais tous les deux rendent votre code moins lisible, moins Pythonic, plus compliqué, moins efficace, plus facile de se tromper, etc.

3
abarnert

Vous pouvez aussi le faire en utilisant numpy:

import numpy as np

N = np.array([1,2,2,3,3,3,4,4,4,4,5,5,5,5,5])
counter = np.arange(1, np.alen(N))
L = np.split(N, counter[N[1:]!=N[:-1]])

L'avantage de cette méthode est que vous avez une autre liste liée à N et que vous souhaitez la diviser de la même manière.

0
syviad