Python“每隔一个元素”的习惯用法
我觉得我花了很多时间在写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)]
(不过如果你对范围的“步幅”功能不太熟悉,可能会觉得不太容易理解)。
和你的代码一样,它会丢掉最后一个值,当你有奇数个值的时候。