使用连续数字将列表向左和向右扩展到总长度的 50%

Posted

技术标签:

【中文标题】使用连续数字将列表向左和向右扩展到总长度的 50%【英文标题】:Extend the list to left and right upto 50 percent of total length with continuous numbers 【发布时间】:2020-03-24 18:01:33 【问题描述】:

我的列表很少,

l1=[8,9,10,11,12,13]
l2=[25,26,27,28,29]

现在我想用连续数字以两种方式扩展列表(右侧长度的 50% 和左侧长度的 50%)。

所以输出列表看起来像,

l1=[5,6,7,8,9,10,11,12,13,14,15,16]
l2=[23,24,25,26,27,28,29,30,31]

我可以使用 for 循环来做到这一点,但是我正在寻找任何 python 快捷方式。

【问题讨论】:

for 循环有什么问题? 【参考方案1】:

如果您的列表是整数的有序列表,您可以执行以下操作:

l = [25,26,27,28,29]

length_l = len(l)
while len(l) < 2*length_l:
    l = [l[0]-1] + l + [l[-1]+1]

print(l)

# > [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]

但可以通过使用range 再次生成列表来完成,如下所示:

l = [8,9,10,11,12,13]

l = list(range(l[0]-len(l)//2, l[-1]+len(l)//2+1))

print(l)

# > [23, 24, 25, 26, 27, 28, 29, 30, 31]

【讨论】:

【参考方案2】:

创建一个辅助函数来添加缺失的部分:

l1=[8,9,10,11,12,13]
l2=[25,26,27,28,29]

def plusFifty(data):
    """Adds half the lists length worth of numbers to the begin and end of the list,
    decrementing from the first value and incrementing from the last value."""
    len_halfed = len(data) // 2 

    r = range(len_halfed)   # 0 ... len//2-1

    # now splice two list comps with the original list 
    return [data[0]-diff-1 for diff in r][::-1]+data+[data[-1]+diff+1 for diff in r]


print( plusFifty(l1))
print( plusFifty(l2))

输出

[5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 14, 15, 16]
[23, 24, 25, 26, 27, 28, 29, 29, 30, 31]

【讨论】:

以上是关于使用连续数字将列表向左和向右扩展到总长度的 50%的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Angular 9 中使用向上、向下、向左和向右箭头键导航动态输入和选择表内的字段?

php 用于向左和向右旋转数组元素的功能

为啥容器在侧面同时从顶部和底部调整大小,以及同时向左和向右调整?

WYT的刷子 题解

单调栈典型例题

Mapbox:如何连续包装要素层