我觉得我花了很多时间在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)
(但如果你不熟悉范围的"跨步"特征,它可以说可读性较差).
与您的代码一样,它会丢弃您具有奇数个值的最后一个值.
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)
我通常会将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)
如何使用以下步骤功能range()
:
[(l[n],l[n+1]) for n in range(0,len(l),2)]
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
27707 次 |
最近记录: |