我正在尝试将列表变成对,但只是尽可能长(即我的列表可能是奇数,在这种情况下我想忽略最后一个元素)。
E.g。我的输入是x = [0, 1, 2, 3, 4]
,我想将其转换为[(0, 1), (2, 3)]
。同样,x = [0, 1, 2, 3, 4, 5]
应该变为[(0, 1), (2, 3), (4, 5)]
。
我目前正在做的是[(x[i], x[i+1]) for i in range(0, len(x), 2)]
。这会中断,因为如果range(0, len(x), 2)
是奇数,x[-1]
仍然包含len(x)
。请注意,[(l, r) for l, r in ...]
形式的某些内容也是首选,而不必使用索引。
奖励积分:以下是更多背景信息。当然,我并没有完全忽略奇数序列的最后一个元素。我正在为每对应用一个函数,但我不想将此函数H
应用于单例元素。目前,我正在做以下事情:
next_layer = [H(layer[i], layer[i+1]) for i in range(0, len(layer), 2)]
if len(layer) & 1: # if there is a lone node left on this layer
next_layer.append(layer[-1])
一个额外优雅的解决方案也会将其纳入上述内容。
答案 0 :(得分:2)
使用zip
此函数返回元组列表,其中第i个元组包含来自每个参数序列或迭代的第i个元素。返回的列表的长度被截断为最短参数序列的长度。
>>> a = [1, 2, 3, 4, 5]
>>> b = [0, 1, 2, 3, 4, 5]
>>> zip(a[::2], a[1::2])
[(1, 2), (3, 4)]
>>> zip(b[::2], b[1::2])
[(0, 1), (2, 3), (4, 5)]