2017-01-21 2 views
0

Können Sie mir mit diesem Code helfen?Warum funktioniert dieser Python-Code nicht?

s = [1, 1, 3, 3, 2, 2, 2, 2, 1, 1, 2, 2, 2] 

def group(s): 
    lst = [] 
    temp_lst = [] 
    for i in s: 
     if len(temp_lst) == 0: 
      temp_lst.append(i) 
      continue 
     if temp_lst[0] == i: 
      temp_lst.append(i) 
     else: 
      lst.append(temp_lst) 
      del temp_lst[:] 
      temp_lst.append(i) 
    return lst 

Es gibt:

[[2, 2, 2], [2, 2, 2], [2, 2, 2], [2, 2, 2]] 

Warum?

Meine gewünschte Ausgabe ist:

[[1, 1], [3, 3], [2, 2, 2, 2], [1, 1], [2, 2, 2]] 
+1

Sie sind die äußere Liste mit Verweisen auf die gleiche innere Liste füllt; 'del tmp_lst [:]' leert die bestehende Liste, Sie erstellen nie eine neue Liste. Beachten Sie auch, dass 'itertools.groupby' Ihnen helfen würde. – jonrsharpe

+0

Verwenden von ['itertools.groupby'] (https://docs.python.org/3/library/itertools.html#itertools.groupby):' [list (g) für _, g in groupby (s)] ' –

Antwort

2

Dies funktioniert: Ersetzte del temp_lst[:] von temp_lst = []

s = [1, 1, 3, 3, 2, 2, 2, 2, 1, 1, 2, 2, 2] 

def group(s): 
    lst = [] 
    temp_lst = [] 
    for i in s: 
     if len(temp_lst) == 0: 
      temp_lst.append(i) 
      continue 
     if temp_lst[0] == i: 
      temp_lst.append(i) 
     else: 
      lst.append(temp_lst) 
      temp_lst = [] 
      temp_lst.append(i) 
    lst.append(temp_lst) 
    return lst 

print group(s) 

Ausgang:

[[1, 1], [3, 3], [2, 2, 2, 2], [1, 1], [2, 2, 2]] 

Was del temp_lst[:] tut, ist, dass es alle Einträge der löscht Liste. Der Schlüssel ist hier zu verstehen, dass Sie durch Bezugnahme arbeiten, und Sie müssen temp_list auf eine neue Liste zeigen, so dass Sie auf der alten Liste arbeiten nicht nur Sie setzen in lst

temp_list = [] Dadurch lässt die alte Liste (die Sie gerade eingefügt in lst) und weist die Variable (Sie können sich einen Zeiger vorstellen) einer neuen leeren Liste zu, die nicht der gerade eingefügten Liste zugeordnet ist.

Wie jonrsharpe korrekt über eine bessere Lösung stellt fest, wäre itertools.groupby:

s = [1, 1, 3, 3, 2, 2, 2, 2, 1, 1, 2, 2, 2] 
[list(l[1]) for l in itertools.groupby(s)] 

Ausgang:

[[1, 1], [3, 3], [2, 2, 2, 2], [1, 1], [2, 2, 2]] 
+1

Vielen Dank, ich verstehe es jetzt! –

+0

@a_z_s Sie begrüßen, habe ich die 'groupby' Lösung, die Python bietet aus der Box ist, ist es wahrscheinlich am besten, diese Lösung statt – hansaplast

+0

@a_z_s oh zu verwenden und Sie vergessen, die letzte' temp_lst' in 'lst hinzuzufügen ', Das habe ich auch im obigen Code korrigiert – hansaplast

Verwandte Themen