wake-up-neo.net

Python - Finden Sie dieselben Werte in einer Liste und gruppieren Sie eine neue Liste

Ich bin fest damit beschäftigt, das herauszufinden und frage mich, ob mich jemand in die richtige Richtung weisen könnte ...

Aus dieser Liste:

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

Ich versuche zu schaffen:

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

Jeder Wert, der sich als gleich herausstellt, wird in seiner eigenen Unterliste gruppiert .. Hier ist mein bisheriger Versuch, ich denke, ich sollte eine while-Schleife verwenden?

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

Jemand erwähnt für N=[1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 1] es wird [[1], [2, 2], [3, 3, 3], [4, 4, 4, 4], [5, 5, 5, 5, 5], [1]] erhalten

Mit anderen Worten, wenn die Nummern der Liste nicht in der richtigen Reihenfolge sind oder es sich um eine Durcheinander-Liste handelt, ist sie nicht verfügbar.

Ich habe also eine bessere Antwort, um dieses Problem zu lösen.

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

Bleib ruhig und benutze 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)])

Ausgabe:

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

Randbemerkung: Verhindern Sie die Verwendung globaler Variablen, wenn Sie need to nicht verwenden.

29
Sam Bruns

Sie können itertools.groupby zusammen mit einem Listenverständnis verwenden

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

Dies kann der Variablen L wie in zugewiesen werden 

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

Sie machen das zu kompliziert.

Sie möchten Folgendes tun: Wenn es für jeden Wert mit dem letzten Wert identisch ist, hängen Sie ihn einfach an die Liste der letzten Werte an. Erstellen Sie andernfalls eine neue Liste. Sie können dieses Englisch direkt in Python übersetzen:

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

Es gibt noch einfachere Möglichkeiten, dies zu tun, wenn Sie etwas abstrakter werden möchten, z. B. durch Verwendung der Gruppierungsfunktionen in itertools. Dies sollte jedoch leicht verständlich sein.


Wenn Sie dies wirklich mit einer while-Schleife tun müssen, können Sie jede for-Schleife in eine while-Schleife wie folgt übersetzen:

for value in iterable:
    do_stuff(value)

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

Wenn Sie wissen, dass die Iteration eine Sequenz ist, können Sie eine etwas einfachere while-Schleife verwenden:

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

Beides führt jedoch dazu, dass Ihr Code weniger lesbar, weniger Pythonic, komplizierter, weniger effizient ist und Sie sich leichter irren können.

3
abarnert

Das kannst du auch mit numpy machen:

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

Der Vorteil dieser Methode ist, wenn Sie eine andere Liste haben, die sich auf N bezieht und Sie diese auf dieselbe Weise aufteilen möchten.

0
syviad