2016-04-13 19 views
3

Hallo, diese Frage ist ähnlich zu dieser anderen Slicing a list into a list of sub-lists, aber in meinem Fall möchte ich das letzte Element der jeweils vorherigen Unterliste als erstes Element in die nächste Untergruppe aufnehmen -Liste. Und haben zu berücksichtigen, dass das letzte Element hat immer mindestens zwei ElementeEine Python-Liste in eine Liste von überlappenden Chunks teilen

zB:

list_ = ['a','b','c','d','e','f','g','h'] 

das Ergebnis für Größe 3 Unterliste:

resultant_list = [['a','b','c'],['c','d','e'],['e','f','g'],['g','h']] 

Antwort

7
>>> list_ = ['a','b','c','d','e','f','g','h'] 
>>> n = 3 # group size 
>>> m = 1 # overlap size 
>>> [list_[i:i+n-m+1] for i in xrange(0,len(list_), n-m)] 
[['a', 'b', 'c'], ['c', 'd', 'e'], ['e', 'f', 'g'], ['g', 'h']] 
2
[list_[i:i+n] for i in xrange(0,len(list_), n-m)] 
+2

Erklären Sie Ihre Lösung. –

+0

Die obere Antwort hatte einen Fehler in der Listenauffassung, der zu unerwartetem Verhalten führte. Ich lieferte, was ich für eine bessere Lösung für diese bestimmte Linie hielt. 'list_ [i: ich + n-m + 1]' macht seltsame Sachen, die wahrscheinlich für die meisten Leute unerwünscht ist, die diese Lösung betrachten. – user3695978

2

more_itertools hat ein Fensterwerkzeug für überlappende Iterables.

Gegeben

import more_itertools as mit 

iterable = list("abcdefgh") 
iterable 
# ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'] 

-Code

windows = list(mit.windowed(iterable, n=3, step=2)) 
windows 
# [('a', 'b', 'c'), ('c', 'd', 'e'), ('e', 'f', 'g'), ('g', 'h', None)] 

Bei Bedarf können Sie die None fillvalue fallen durch die Fenster Filterung:

[list(filter(None, w)) for w in windows] 
# [['a', 'b', 'c'], ['c', 'd', 'e'], ['e', 'f', 'g'], ['g', 'h']] 

Se e auch more_itertools docs für Details auf more_itertools.windowed

Verwandte Themen