簡體   English   中英

列表中每隔n個項目獲取一個項目

[英]get a chunk of items every n items in list

說我有以下列表:

l = [4,3,1,5,3,5,8,11,10,4,12,2,1]

切片l以獲取長度為n塊,從而在塊之間保留k項目的最有效方法是什么?

例如,如果n=2k=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])

我的觀點是列表理解,即使您需要使用兩個,因為否則它只會產生一個列表列表。

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]
k,n=3,2
res=[]
while l:
    res+=l[:n]
    l=l[n+k:]
print(res)

可以通過pythonicizity對其進行重大優化。

以下是使用切片的另一種解決方案

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個元素。 然后將兩者合並

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM