从列表L创建(L[i], L[i+1])元组列表

3
假设我们有一个列表 L = [1,2,3,4,5],有没有一种简洁的方法可以生成如下形式的元组列表:T = [(1,2),(2,3),(3,4),(4,5)]
如果有更好的替代方法,那就太好了。
    T = []
    for i in range(len(L) - 1):
        T.append((L[i], L[i+1]))

或者等价的理解。
4个回答

11
你可以使用内置的 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)]

正是我所需要的。谢谢! - rookie
最快的......真棒... - emesday

2

尝试:

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

这应该可以解决问题。
请注意。
list(zip(l, l[1:]))

因为zip函数会截取最长的那个对象,所以该方法同样有效,但不够明确。


我认为第二个更清晰,即使它等效于第一个,我也不会考虑编写第一个。问题提到“T = [(1,2),(2,3),(3,4),(4,5)]”,对我来说,视觉检查显示每个元组的第一个元素是l;第二个元素来自l [1:]。 - Paddy3118
好的,对于这个问题,总是有两种看法。如果您不熟悉zip函数,我认为第一种方法更清晰,因为第一列中缺少了最后一个元素。您需要了解zip函数的截断(也有zip_longest函数)。 - Retozi
哦,我知道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)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接