【问题标题】:How to split a list by a changing step size?如何通过改变步长来拆分列表?
【发布时间】:2016-08-25 17:18:18
【问题描述】:

我有一个列表,我想将其拆分为可变步长。例如,如果我有一个从 1 到 100 的列表,在每次迭代结束时,我希望输出为:

[1, 2, 3] 
[4, 5, 6, 7, 8]
[9, 10, 11, 12, ..., 15]
[16, 17, ..., 25]

第一个列表的长度是 3,然后是 5,然后是 7,然后是 9。

我有的是这个

lst = list(range(1,101))
odd = 3
for i in range(0, len(lst), odd):
    print(lst[i:i+odd])
    odd += 2

我知道它不起作用,但我不知道需要改变什么。

【问题讨论】:

  • 在我看来,第三个列表应该以 15 结尾,而不是 16。

标签: python list for-loop


【解决方案1】:

请注意,开始切片的索引由封闭形式给出:

n**2 - 1 

因此:

>>> [lst[n**2-1:(n+1)**2-1] for n in range(1, 10)]
[[1, 2, 3],
 [4, 5, 6, 7, 8],
 [9, 10, 11, 12, 13, 14, 15],
 [16, 17, 18, 19, 20, 21, 22, 23, 24],
 [25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35],
 [36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48],
 [49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63],
 [64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80],
 [81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]]

【讨论】:

  • 这对于我给出的特定示例非常有用,但我的基本问题是询问如何处理可变步长
【解决方案2】:

由于步长不同,需要一个while循环:

lst = list(range(1,101))
step = 3
idx = 0
while idx<len(lst):
    print(lst[idx:idx+step])
    idx += step
    step += 2

【讨论】:

  • 为了使这个答案更完整,请说明range(..)的步长不会在每次迭代中改变..
【解决方案3】:

Daniel 的回答是最简洁的,但我想指出,有时,您的情况更复杂,并且希望从不同的迭代中获得相同的切片。然后,您还可以继续存储当您将[start:stop:step] 写入列表并使用它时python 生成的实际slice(start,stop[,step]) 对象。例如:

r1 = range(1,101)
r2 = list(reversed(r1))

slices = [slice(0,5,3)]
for i in range(20):
    slices.append( slice(
                         slices[-1].stop,
                         slices[-1].stop + slices[-1].step + 1,
                         slices[-1].step + 1)
                 )

print [ (r1[s],r2[s]) for s in slices ]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多