2017-02-16 6 views
1

Ich habe eine Liste wieListe Gruppe von Tupeln

A = [1,10,50,100,500] 

I durch 2 Zahlen mit dem richtigen Reihenfolge zu gruppieren müssen. Die Ausgabe ist wie diese,

B = [(1,9),(10,49),(50,99),(100,499)] 

Ich habe versucht, über yield:

def group(lst, n): 
    for i in range(0, len(lst), n): 
     val = lst[i:i+n] 
     if len(val) == n: 
      yield tuple(val) 

print(list(group([1,10,50,100,500], 2))) 
+0

Sind Sie sicher, dass Sie nicht 'bisect' stattdessen verwenden sollten? –

Antwort

1

Sie können einfach zip die Sequenz mit sich selbst (ohne das erste Element):

A = [1,10,50,100,500] 

def group(lst): 
    for i, j in zip(A, A[1:]): # pairwise items 
     yield (i, j-1)   # decrement second item by 1 

>>> list(group(A)) 
[(1, 9), (10, 49), (50, 99), (100, 499)] 

Oder es verwenden als Liste Verständnis ohne Zwischenfunktion:

>>> [(i, j-1) for i, j in zip(A, A[1:])] 
[(1, 9), (10, 49), (50, 99), (100, 499)] 
0

Sie können Liste Verständnis mit islice und zip verwenden paarweise über die Liste iterieren:

>>> from itertools import islice 
>>> A = [1,10,50,100,500] 
>>> [(x, y - 1) for x, y in zip(A, islice(A, 1, None))] 
[(1, 9), (10, 49), (50, 99), (100, 499)] 

In oben islice gibt einen Iterator, der auf A von dem zweiten Element beginnt. islice wird anstelle der normalen Slicing verwendet, so dass die ursprüngliche Liste nicht kopiert werden muss:

>>> s = list(islice(A, 1, None)) 
>>> s 
[10, 50, 100, 500] 

Dann zip verwendet wird iterable Paare von Elementen aus der ursprünglichen Liste und Iterator zu erstellen:

>>> pairs = list(zip(A, s)) 
>>> pairs 
[(1, 10), (10, 50), (50, 100), (100, 500)] 

Und schließlich listet List Verständnis über die Paare, um das Ergebnis zu erstellen:

>>> [(x, y - 1) for x, y in pairs] 
[(1, 9), (10, 49), (50, 99), (100, 499)]