Python 数组中的循环对?

Python 数组中的循环对?,python,arrays,Python,Arrays,我不敢相信这是哪里都找不到的,但是:我想要一个数组中的所有连续对,包括最后一个元素和第一个元素。我试过: [(a, b) for a, b in zip(list, list[1:])] 什么是最具python风格和效率的方法?您只需将第一个元素添加到第二个列表中: l = [1,2,3,4,5,6] r = [(a, b) for a, b in zip(l, l[1:]+l[:1])] 结果: [(1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 1

我不敢相信这是哪里都找不到的,但是:我想要一个数组中的所有连续对,包括最后一个元素和第一个元素。我试过:

[(a, b) for a, b in zip(list, list[1:])]

什么是最具python风格和效率的方法?

您只需将第一个元素添加到第二个列表中:

l = [1,2,3,4,5,6]

r = [(a, b) for a, b in zip(l, l[1:]+l[:1])]
结果:

[(1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 1)]
旁白:“pythonic”也意味着不使用
list
作为变量名

变体:使用
itertools.ziplongest
而不是
zip
,并填充第一个元素(作为奖励,也可用于
numpy
数组,因为没有添加):


下面是另一种使用


另一种方法是使用模从最后一个元素跳回到第一个元素:

l = [1,2,3,4,5,6]
n = len(l)
[(l[i], l[(i+1) % n]) for i in range(n)]
它返回:

[(1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 1)]

我并不质疑其中一些答案的冷静,但似乎没有人对它们进行计时,就“Pythonic”而言,与仅仅将圆形部分附加或延伸到末端相比,它们可能会变得有点模糊

l = xrange(1, 10000)

def simple_way(list_input):
    a = [(list_input[i], list_input[i+1]) for i in xrange(len(list_input)-1)]
    a.append((list_input[-1], list_input[0]))
    return a


timeit simple_way(l)
1000 loops, best of 3: 1.14 ms per loop

def top_rated_answer(list_input):
    n = len(list_input)
    a = [(list_input[i], list_input[(i+1) % n]) for i in xrange(n)]
    return a


timeit top_rated_answer(l)
1000 loops, best of 3: 1.37 ms per loop

谢谢:)你知道为什么当我使用数组而不是列表时会出现故障吗?我知道它们大部分是可以互换的,但并不总是。@John你说的“数组”是什么意思?A
numpy.array
?是的,如果l是一个numpy.array,那么这不起作用,只会给我前两对。使用
np.concatenate([arr[1:],arr[:1]])
@juanpa.arrivillaga添加了一个与数组无关的变体(可能快了一点,但仍然可能没有Eric答案快)使用
deque
rotate
达到实际有用的目的。稀有的投票给每个人!这可能是最有效的方法,但可能不是最容易立即理解的方法。这不是最性感的方法,但可能是最快的解决方案,因为它不会创建临时列表。在C语言中,你会喜欢这样做,因为创建一个deque或列表很烦人。@Jean-franoisfabre你在说什么,Jean?模运算很性感!从现在开始:不,
lambda
回答:我投反对票:)我希望更多地见到像你这样的Noobie
range
在Python2中效率较低,但至少可以工作(您可以提到:“使用
xrange
提高Python2爱好者的效率”)尝试
a.append((l[-1],l[0])更好:)一行代码很性感,但有时一个好的老式C代码会更快,是的。甚至,模是昂贵的。如果没有其他东西的话,由于分析,它值得更多的投票。想要做某事的最佳方式吗?测试!
[(1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 1)]
l = xrange(1, 10000)

def simple_way(list_input):
    a = [(list_input[i], list_input[i+1]) for i in xrange(len(list_input)-1)]
    a.append((list_input[-1], list_input[0]))
    return a


timeit simple_way(l)
1000 loops, best of 3: 1.14 ms per loop

def top_rated_answer(list_input):
    n = len(list_input)
    a = [(list_input[i], list_input[(i+1) % n]) for i in xrange(n)]
    return a


timeit top_rated_answer(l)
1000 loops, best of 3: 1.37 ms per loop