Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在列表中每隔n个项获取一块项_Python_Arrays_List_Numpy - Fatal编程技术网

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的情况下完成的。