Python"Every Other Element"成语

Mat*_*ngo 38 python idioms

我觉得我花了很多时间在Python中编写代码,但没有足够的时间创建Pythonic代码.最近我遇到了一个有趣的小问题,我认为可能有一个简单,惯用的解决方案.解释原文,我需要收集列表中的每个连续对.例如,给定列表[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)]
Run Code Online (Sandbox Code Playgroud)

在长度不均匀的情况下,其具有抛弃最后一个数字的副作用.

是否有一种我不知道的惯用方法,或者这是我最好的方法?

Ric*_*dle 81

这样做会更整齐:

>>> data = [1,2,3,4,5,6]
>>> zip(data[0::2], data[1::2])
[(1, 2), (3, 4), (5, 6)]
Run Code Online (Sandbox Code Playgroud)

(但如果你不熟悉范围的"跨步"特征,它可以说可读性较差).

与您的代码一样,它会丢弃您具有奇数个值的最后一个值.

  • 在执行上述操作以处理奇数项目方案之前,您可以执行`data + = [None]`. (2认同)

Ign*_*ams 49

经常被引用的是:

zip(*[iter(l)] * 2)
Run Code Online (Sandbox Code Playgroud)

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

it = iter(l)
list(zip(it, it))
# [(1, 2), (3, 4), (5, 6)]
Run Code Online (Sandbox Code Playgroud)

  • 知道,虽然RichieHindle赢得了接受的答案(真的很难忽视可读性),但这个答案赢得了我的心. (9认同)
  • 太棒了,但读起来像perl ;-) (8认同)

Mik*_*ham 9

我通常会将itertools文档中的grouper配方复制到我的代码中.

def grouper(n, iterable, fillvalue=None):
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)
Run Code Online (Sandbox Code Playgroud)


Isa*_*aac 8

如何使用以下步骤功能range():

[(l[n],l[n+1]) for n in range(0,len(l),2)]
Run Code Online (Sandbox Code Playgroud)