Python 在列表中每隔n个项获取一块项
假设我有以下清单:Python 在列表中每隔n个项获取一块项,python,arrays,list,numpy,Python,Arrays,List,Numpy,假设我有以下清单: l = [4,3,1,5,3,5,8,11,10,4,12,2,1] 为了获得长度为n的块,在块之间保留k项,什么是切片l的最有技巧的方法 例如,如果n=2和k=3结果应该是: [4,3,5,8,12,2] 使用列表理解: [e for i in range(0, len(l), n+k) for e in l[i:i+n]] # [4, 3, 5, 8, 12, 2] numpy解决方案是: import numpy as np idx = (np.arange(0
l = [4,3,1,5,3,5,8,11,10,4,12,2,1]
为了获得长度为n
的块,在块之间保留k
项,什么是切片l
的最有技巧的方法
例如,如果n=2
和k=3
结果应该是:
[4,3,5,8,12,2]
使用列表理解:
[e for i in range(0, len(l), n+k) for e in l[i:i+n]]
# [4, 3, 5, 8, 12, 2]
numpy
解决方案是:
import numpy as np
idx = (np.arange(0, len(l), n+k)[:,None] + np.arange(n)).ravel()
np.array(l)[idx]
# array([ 4, 3, 5, 8, 12, 2])
使用列表理解:
[e for i in range(0, len(l), n+k) for e in l[i:i+n]]
# [4, 3, 5, 8, 12, 2]
numpy
解决方案是:
import numpy as np
idx = (np.arange(0, len(l), n+k)[:,None] + np.arange(n)).ravel()
np.array(l)[idx]
# array([ 4, 3, 5, 8, 12, 2])
一个可能的解决办法是
l = [4,3,1,5,3,5,8,11,10,4,12]
k,n=3,2
res=[]
while l:
res+=l[:n]
l=l[n+k:]
print(res)
这可能会通过pythonizity的方式进行大量优化 一个可能的解决方案是
l = [4,3,1,5,3,5,8,11,10,4,12]
k,n=3,2
res=[]
while l:
res+=l[:n]
l=l[n+k:]
print(res)
这可能会通过pythonizity的方式进行大量优化 使用切片的替代解决方案如下
l = np.array([4,3,1,5,3,5,8,11,10,4,12,2,1])
A = l[:][::5]
B = l[1:][::5]
final = np.insert(B, np.arange(len(A)), A)
# array([ 4, 3, 5, 8, 12, 2])
l[:][::5]
从第一个元素开始每5个元素为您提供一次,而l[1::[::5]
从第二个元素开始每5个元素为您提供一次。然后将两者合并在一起下面是一个使用切片的替代解决方案
l = np.array([4,3,1,5,3,5,8,11,10,4,12,2,1])
A = l[:][::5]
B = l[1:][::5]
final = np.insert(B, np.arange(len(A)), A)
# array([ 4, 3, 5, 8, 12, 2])
l[:][::5]
从第一个元素开始每5个元素为您提供一次,而l[1::[::5]
从第二个元素开始每5个元素为您提供一次。然后将两者合并在一起我的理解是列表理解,即使您需要使用两个,否则它只会生成列表
l = [4,3,1,5,3,5,8,11,10,4,12,2,1]
n = 2
k = 3
chunk_l = [y for x in [l[i:i+n] for i in range(0,len(l), n+k)] for y in x]
print(chunk_l)
#[4, 3, 5, 8, 12, 2]
我的理解是列表理解,即使你需要使用两个,否则它只会产生一个列表
l = [4,3,1,5,3,5,8,11,10,4,12,2,1]
n = 2
k = 3
chunk_l = [y for x in [l[i:i+n] for i in range(0,len(l), n+k)] for y in x]
print(chunk_l)
#[4, 3, 5, 8, 12, 2]
你的意思是什么是对列表l进行切片的最具python风格的方法,这样它就可以为列表l中的每n返回一个长度为k的块?你能详细说明一下你是如何得到结果的吗?我想长度为n的块,从列表中跳过长度为k的块,l就是你想要的。你的意思是什么是对列表l进行切片的最具python风格的方法,以便它为列表l中的每n返回长度为k的块?你能详细说明一下你是如何得到结果的吗?我认为长度为n的一块,从列表中跳过长度为k的一块,l就是你想要的。我认为使用生成器可能是最好的方法。请注意,也可以不使用numpy来完成。如果生成器已经有了生成器,那么它是很棒的,但是OP有一个列表,我不知道生成器是否适合这里。是的,第一个列表理解解决方案是在没有numpy的情况下完成的。我认为使用生成器可能是最好的方法。请注意,也可以不使用numpy来完成。如果生成器已经有了生成器,那么它是很棒的,但是OP有一个列表,我不知道生成器是否适合这里。也是的,第一个列表理解解决方案是在没有numpy的情况下完成的。