2017-02-16 5 views
1

У меня есть список, какСписок для группы кортежей

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

Мне нужно сгруппировать по 2 номера с правильной последовательностью. Выход, как это,

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

Я попытался с помощью 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

вы уверены, что вы не должны использовать 'bisect' вместо этого? –

ответ

1

Вы можете просто zip последовательность с собой (без первого элемента):

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

Или использовать его как понимание списка без промежуточной функции:

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

Вы можете использовать список понимание с islice и zip итерировать парно по списку:

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

В выше islice возвращает итератор, который начинается со второго элемента на A. islice используется вместо обычного нарезания так, что первоначальный список не должен быть скопирован:

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

Затем zip используется для создания итератора пара элементов из исходного списка и итератора:

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

И, наконец, список понимания итерацию по парам, чтобы создать результат:

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