使用不一致的间隔切片Python列表。

4

我有一家公司的股票价格清单。现在我想将列表分割成多个区间。 我们将像这样存储价格:前2个元素,然后是接下来的3个元素,然后是2个元素,以此类推。

meta_stocks = [10, 9, 11, 15, 19, 22, 25, 11, 15, 17]

输出

meta_stocks = [[10, 9],[11, 15, 19],[22, 25],[ 11, 15, 17]]

我可以将列表每5个项目拆分一次,但无法进一步拆分。

>>> [meta_stocks[i:i+interval2] for i in range(0, len(meta_stocks), interval2)]
>>> [[10, 9, 11, 15, 19], [22, 25, 11, 15, 17]]

你可以将列表分成每个包含5个元素的小列表,然后按照你想要的方式将它们拆分为3+2或其他组合。 - MSH
这就是我一直在尝试的,但是无法弄清楚。 - Tarun K
7个回答

6
你可以使用 itertools.cycle 和列表推导式完成以下操作:
meta_stocks = [10, 9, 11, 15, 19, 22, 25, 11, 15, 17]

from itertools import cycle

start = 0
l = [2,3]
c = cycle(l)

[meta_stocks[start:(start:=start+next(c))]
 for i in range(len(l)*len(meta_stocks)//sum(l))]

输出:

[[10, 9], [11, 15, 19], [22, 25], [11, 15, 17]]

2

您可以这样做,无需使用其他导入:

meta_stocks = [10, 9, 11, 15, 19, 22, 25, 11, 15, 17]
meta_stocks_out = []
offset = 0
interval = 2
while offset + interval <= len(meta_stocks):
    meta_stocks_out.append(meta_stocks[offset:offset+interval])
    offset += interval
    interval = 2 if interval == 3 else 3
print(meta_stocks_out)

1

一些itertools来拯救:

from itertools import islice, cycle, takewhile

i = iter(meta_stocks)
intervals = [2, 3]

[*takewhile(lambda _: _, ([*islice(i, n)] for n in cycle(intervals)))]
# [[10, 9], [11, 15, 19], [22, 25], [11, 15, 17]]

1

使用itertools.islice

from itertools import islice

meta_stocks = [10, 9, 11, 15, 19, 22, 25, 11, 15, 17]
chunks = [2, 3, 2, 3                 # length of each sublist

it = iter(meta_stocks)               
result = [list(islice(it, i)) for i in chunks]

print(result)
#Output: [[10, 9], [11, 15, 19], [22, 25], [11, 15, 17]]

0

你可以尝试这个方法。首先,我们获取一个列表,其中每个元素都是包含两个子列表的列表,分别包含2个和3个元素。然后,我们将列表的第一层展开。

import pprint
meta_stocks = [10, 9, 11, 15, 19, 22, 25, 11, 15, 17]
new_list = [item for sublist in [[meta_stocks[i:i+2], meta_stocks[i+2:i+5]] for i in range(0, len(meta_stocks), 5)] for item in sublist]
pprint.pprint(new_list)

以及输出

[[10, 9], [11, 15, 19], [22, 25], [11, 15, 17]]

0

尝试:

meta_stocks = [10, 9, 11, 15, 19, 22, 25, 11, 15, 17]

res = [x for i in range(0, len(meta_stocks), 5) for x in [meta_stocks[i:i+2], meta_stocks[i+2:i+5]]]
print(res)

输出

[[10, 9], [11, 15, 19], [22, 25], [11, 15, 17]]

使用 itertools.accumulate 的一般方法:

from itertools import accumulate

meta_stocks = [10, 9, 11, 15, 19, 22, 25, 11, 15, 17]

step = sum([2, 3])
steps = list(accumulate([0, 2, 3]))

res = [x for i in range(0, len(meta_stocks), 5) for x in [meta_stocks[i+s:i+e] for s, e in zip(steps, steps[1:])]]
print(res)

                                                                                                       

0

假设你已经把区间表示成一个整数列表

meta_stocks = [10, 9, 11, 15, 19, 22, 25, 11, 15, 17]
intervals = [2,3,2,3]

cintervals = [sum(intervals[:i]) for i in range(0,len(intervals)+1)]

sliced = [meta_stocks[cintervals[i-1]:cintervals[i]] for i in range(1, len(cintervals))]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接