在Python中,如何从上一个块的最后一个元素开始,将列表拆分为大小相等的块?
转换列表的最佳方式是什么,如:在Python中,如何从上一个块的最后一个元素开始,将列表拆分为大小相等的块?,python,list,Python,List,转换列表的最佳方式是什么,如: mylist = [0,1,2,3,4,5,6,7,8] 分为n个元素块,这些元素总是以前一个块的最后一个元素开始。 最后一个区块的最后一个元素应与第一个区块的第一个元素相同,以使数据结构循环。 比如: 假设len(mylist)%(n-1)=0。所以它总是很好地工作。那么简单的解决方案呢 splitlists = [mylist[i:i+n] for i in range(0, len(mylist), n-1)] splitlists[-1].append(
mylist = [0,1,2,3,4,5,6,7,8]
分为n
个元素块,这些元素总是以前一个块的最后一个元素开始。
最后一个区块的最后一个元素应与第一个区块的第一个元素相同,以使数据结构循环。
比如:
假设
len(mylist)%(n-1)=0
。所以它总是很好地工作。那么简单的解决方案呢
splitlists = [mylist[i:i+n] for i in range(0, len(mylist), n-1)]
splitlists[-1].append(splitlists[0][0])
一个涉及numpy的简单得多的解决方案(为了避免过度使用):
因此,区块的长度是您的定义变量,或者区块的数量?@sr2222可以是,对于我的问题,区块的数量实际上是更好的定义变量。您可以使用
[(lis+[lis[0]])[i:i+n]来定义范围(0,len(lis),n-1)]
,跳过第二步,这有什么好处吗?这取决于具体情况。如果使用默认数组dtype(int64),纯python解决方案的性能与numpy解决方案一样好。当您开始减小整数大小时,您开始看到显著的改进。见:
splitlists = [mylist[i:i+n] for i in range(0, len(mylist), n-1)]
splitlists[-1].append(splitlists[0][0])
from numpy import arange, roll, column_stack
n = 4
values = arange(10, 26)
# values -> [10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25]
idx = arange(0, values.size, n) # [ 0 4 8 12]
idx = roll(idx, -1) # [ 4 8 12 0]
col = values[idx] # [14 18 22 10]
values = column_stack( (values.reshape(n, -1), col) )
[[10 11 12 13 14]
[14 15 16 17 18]
[18 19 20 21 22]
[22 23 24 25 10]]