Python“每隔一个元素”的习惯用法

42 投票
8 回答
33429 浏览
提问于 2025-04-15 21:33

我觉得我花了很多时间在写Python代码上,但却没有花足够的时间去写“Python风格”的代码。最近我遇到了一个有趣的小问题,我觉得可能有简单而地道的解决办法。简单来说,我需要从一个列表中收集每一对连续的数字。例如,给定列表[1,2,3,4,5,6],我想得到[(1,2),(3,4),(5,6)]

当时我想出了一个快速的解决方案,看起来像是翻译过来的Java代码。重新审视这个问题后,我能想到的最好办法是

l = [1,2,3,4,5,6]
[(l[2*x],l[2*x+1]) for x in range(len(l)/2)]

但这样做的一个副作用是,如果列表的长度不是偶数,就会把最后一个数字丢掉。

有没有什么更地道的方法我没想到,还是说这就是我能做到的最好结果?

8 个回答

9

你可以试试使用 range() 这个函数的步长功能:

[(l[n],l[n+1]) for n in range(0,len(l),2)]
50

大家常常引用的一个例子是:

zip(*[iter(l)] * 2)

我更喜欢这个更易读的 iter 解决方案:

it = iter(l)
list(zip(it, it))
# [(1, 2), (3, 4), (5, 6)]
90

这样做会更整洁一些:

>>> data = [1,2,3,4,5,6]
>>> zip(data[0::2], data[1::2])
[(1, 2), (3, 4), (5, 6)]

(不过如果你对范围的“步幅”功能不太熟悉,可能会觉得不太容易理解)。

和你的代码一样,它会丢掉最后一个值,当你有奇数个值的时候。

撰写回答