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

时间:2015-10-13 10:04:57

标签: python readability

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

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

一个额外优雅的解决方案也会将其纳入上述内容。

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