在可用时形成对的可读方式

Readable way to form pairs while available

我正在尝试将列表变成对,但尽可能长(即我的列表可能是奇数,在这种情况下我想忽略最后一个元素)。

例如我的输入是 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 ...] 形式的内容也更可取,而不是必须使用索引 fiddle。

奖励积分:这里有一些更多的背景信息。当然,我并没有完全忽略奇数序列的最后一个元素。我正在对每一对应用一个函数,但我不想将此函数 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])

一个更优雅的解决方案也将把它合并到上面。

使用 zip

This function returns a list of tuples, where the i-th tuple contains the i-th element from each of the argument sequences or iterables. The returned list is truncated in length to the length of the shortest argument sequence.

>>> 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)]