假设我有一个数组[0, 1, 2, 3, 4, 5, 6, 7]
和一个元组:(3, 3, 2)
。
我正在寻找一种基于元组数据将数组拆分为3
数组的方法:
[0, 1, 2]
[3, 4, 5]
[6, 7]
我可以编写这样的简单代码来获得所需的内容,但是我正在寻找一种正确且Python方式的方法:
为了简单起见,我使用了列表。
a = [0, 1, 2, 3, 4, 5, 6, 7]
b = (3, 3, 2)
pointer = 0
for i in b:
lst = []
for j in range(i):
lst.append(a[pointer])
pointer += 1
print(lst)
或者这个:
a = [0, 1, 2, 3, 4, 5, 6, 7]
b = (3, 3, 2)
pointer = 0
for i in b:
lst = a[pointer:pointer+i]
pointer += i
print(lst)
结果:
[0, 1, 2]
[3, 4, 5]
[6, 7]
答案 0 :(得分:2)
如果您不想修改输入列表,则可以使用迭代器和itertools module。
.count()
第一步,创建一个迭代器,该迭代器从>>> from itertools import islice
>>> a = [0, 1, 2, 3, 4, 5, 6, 7]
>>> b = (3, 3, 2)
>>> i = iter(a)
>>> [list(islice(i, x)) for x in b]
[[0, 1, 2], [3, 4, 5], [6, 7]]
的第一个元素开始。然后,对a
中的数字进行list comprehension迭代,并在每一步中从迭代器中相应提取许多元素并将其存储在结果列表中。
答案 1 :(得分:1)
您可以使用numpy的split方法
import numpy as np
a = [0, 1, 2, 3, 4, 5, 6, 7]
b = (3, 3, 2)
c = np.split(a, np.cumsum(b)[:-1])
for r in c:
print(r)
np.split(a,b)沿给定轴将a除以b中的索引(默认为0)。
答案 2 :(得分:0)
一种更简单的方法是:
a = [0, 1, 2, 3, 4, 5, 6, 7]
b = (3, 3, 2)
for ind in b:
print(a[:ind])
a = a[ind:]
它遍历b
中的切片大小,同时每次都缩短原始数组。如果您需要其他切片,则可以轻松地将结果切片作为子列表附加。几乎就像您的解决方案之一,除了它不使用任何额外的变量并直接通过b
的元素进行迭代。
此外,我不会将变量称为a
和b
-当然,在这种情况下,变量具有明确的含义,您可以通过它们的名称来表示,所以肯定不会。更有意义的名称会减少错误的数量,并使代码更清晰,这对于更大/更复杂的代码来说是真正的区别。我会至少将a
和in_list
b
称为slices
,但是如果上下文更多,这可能会更好。
答案 3 :(得分:0)
最“简洁”的语法是:
ex_array = [0,1,2,3,4,5,6,7] 示例=(3,3,2)
result = [ex_array[sum(extuple[:iii]):sum(extuple[:iii])+extuple[iii]] for iii in range(len(extuple))]
结果将是预期子列表的列表
答案 4 :(得分:0)
重新使用Compare two adjacent elements in same list中的pairwise
函数,您还可以:
from itertools import accumulate
from more_itertools import pairwise
a = [0, 1, 2, 3, 4, 5, 6, 7]
b = (3, 3, 2)
[a[slice(*s)] for s in pairwise(accumulate((0,)+b))]
首先,np.split
答案可能更快(更容易阅读)。