2014-04-11 2 views
3

Скажем, у нас есть список L = [1,2,3,4,5]. Есть ли простой способ составить список кортежей следующего вида: T = [(1,2),(2,3),(3,4),(4,5)]?Создать (L [i], L [i + 1]) список кортежей из списка L

Было бы здорово, если бы было лучше альтернатива

T = [] 
    for i in range(len(L) - 1): 
     T.append((L[i], L[i+1])) 

Или эквивалент понимания.

ответ

10

Вы можете использовать встроенную функцию zip: zip(L, L[1:])

In [4]: L = [1,2,3,4,5] 

In [5]: zip(L, L[1:]) 
Out[5]: [(1, 2), (2, 3), (3, 4), (4, 5)] 
+0

именно то, что я искал. Спасибо! – rookie

+0

самый быстрый когда-либо ....... awesome ... – emeth

2

попробовать:

list(zip(l[:-1], l[1:])) 

Это должно сделать это.

отмечают, что

list(zip(l, l[1:])) 

работает как хорошо, так как молния разрезает самый длинный парень, но менее явно.

+0

Я считаю, что второе должно быть яснее и никогда не подумало бы писать первое, даже если оно эквивалентно. В вопросе упоминается «T = [(1,2), (2,3), (3,4), (4,5)]», а визуальный осмотр для меня показывает первый элемент o каждого кортежа l; второй - от l [1:]. – Paddy3118

+0

Ну, всегда есть два способа взглянуть на него, если вы не знакомы с zip-функцией, первое, на мой взгляд, яснее, потому что последний элемент отсутствует в первом столбце. Вам нужно знать о разрезе zip (также есть zip_longest) – Retozi

+0

О, я знаю про zip. (Я написал эту запись в блоге по одному ее аспекту: http://paddy3118.blogspot.co.uk/2007/02/unzip-un-needed-in-python.html). Я просто хотел узнать, какой аспект описания заставил вас думать, что ваш первый ответ лучше. Вы объясните, что это связано с рассмотрением последних элементов. Точно так же. Я предполагаю, что это случай, если это ваза или два лица, смотрящие друг на друга: http://en.wikipedia.org/wiki/Rubin_vase – Paddy3118

0
In [15]: L = [1,2,3,4,5] 
In [16]: oL = [(x, y) for x, y in zip(L, L[1:])] 
In [17]: oL 
Out[17]: [(1, 2), (2, 3), (3, 4), (4, 5)] 

Или просто

oL = zip(L, L[1:]) 
0

наивный подход, используя список понимание, что это будет работать так же, хотя я не уверен, что при использовании zip быстрее.

L = [1,2,3,4,5] 
[(L[i], L[i+1]) for i in range(len(L) - 1)] 
Смежные вопросы