2016-08-01 6 views
0

ich eine einfache Liste Splitting Frage:Split Liste Verständnis in verschachtelten Listen auf einem regelbasierten

eine verschachtelte Liste wie folgt angegeben:

x = [[1,4,3],[2,3,5,1,3,52,3,5,2,1],[2]] 

Ich mag ferner jedes Element aufgeteilt (Teilliste) länger als 3, und deren Länge ein Vielfaches von 3 oder 3 n + 1 in Teillisten der Länge 3, mit Ausnahme der letzten Brocken, so das Ergebnis, das ich will, ist:

x2 = [[1,4,3], [2,3,5],[1,3,52],[3,5,2,1],[2]] 

denke ich, es sein kann, getan mit itertools.groupby an d/oder Ertrag Funktionen ... konnte aber nicht die Details zusammen >> a_function (x) ...

splits = [ a_function(x) if len(x)>3 and (len(x) % 3 == 0 or len(x) % 3 == 1) else x for x in x] 

Könnte jemand bitte geben Sie mir einige Hinweise? Vielen Dank.

+0

Für Listen, die nicht durch drei teilbar sind, wie werden sie gehandhabt ...? –

+0

Auch http://stackoverflow.com/questions/312443/how-do-you-split-a-list-into-evelly-sized-chunks-in-python?rq=1. –

+0

@ g.d.d.c, vielen Dank für Ihre Antwort! 3n + 2 Werte bleiben so wie sie sind ... und vielen Dank für den Link !! tho merkte ich, dass meine Frage ein bisschen mehr beteiligt ist, als ich gerade jetzt redigierte ... – shenglih

Antwort

0

Manchmal, wenn die Voraussetzungen für eine Liste Verständnis ungewöhnliche oder kompliziert sind, habe ich eine Generatorfunktion verwenden, etwa so:

def gen(l): 
    for sublist in l: 
     if len(sublist)%3 == 0: 
      for i in range(0, len(sublist), 3): 
       yield sublist[i:i+3] 
     elif len(sublist)%3 == 1: 
      for i in range(0, len(sublist)-4, 3): 
       yield sublist[i:i+3] 
      yield sublist[-4:] 
     else: 
      yield sublist 

# OP's data: 
x = [[1,4,3],[2,3,5,1,3,52,3,5,2],[2]] 
y = [[1,4,3],[2,3,5,1,3,52,3,5,2,1],[2]] 

# Using either list comprehension or list constructor: 
newx = [item for item in gen(x)] 
newy = list(gen(y)) 

# Result: 
assert newx == [[1, 4, 3], [2, 3, 5], [1, 3, 52], [3, 5, 2], [2]] 
assert newy == [[1, 4, 3], [2, 3, 5], [1, 3, 52], [3, 5, 2, 1], [2]] 
0
# Create the list 
x = [[1,4,3],[2,3,5,1,3,52,3,5,2,1],[2]] 
test = [] 
# Loop through each index of the list 
for i in range(len(x)): 
#if the length of the specific index is 3 then go do this loop. 
    if len(x[i]) > 3: 
     j = len(x[i]) 
     # This cuts through the loop every 3 steps and makes it a new list. 
     test = ([x[i][j:j+3] for j in range(0, len(x[i]), 3)]) 
     # If the length of the last index is 1 then add it to the previous index of the new list. 
     if len(test[-1]) == 1: 
       test[-2] = test[-2] + test[-1] 
       # pop deletes the last entry 
       test.pop(-1) 
       x[i] = test 
     else: 
      x[i] = test 

Sie dann die Ausgabe:

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