получить кусок предметов каждые n предметов в списке - PullRequest
0 голосов
/ 20 декабря 2018

Скажите, у меня есть следующий список:

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

Какой самый питонический способ нарезать l, чтобы получить куски длиной n, оставляющие k элементов между кусками?

Например, если n=2 и k=3, результат должен быть:

[4,3,5,8,12,2]

Ответы [ 4 ]

0 голосов
/ 20 декабря 2018

Я бы взял списки, хотя вам нужно использовать два, потому что в противном случае он просто создал бы список списков.

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]
0 голосов
/ 20 декабря 2018

Возможное решение:

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)

Вероятно, это может быть сильно оптимизировано с точки зрения питонизации.

0 голосов
/ 20 декабря 2018

Одно альтернативное решение с использованием нарезки может быть следующим:

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-й элемент, начиная со второго элемента.Затем вы объединяете их вместе

0 голосов
/ 20 декабря 2018

Используйте понимание списка:

[e for i in range(0, len(l), n+k) for e in l[i:i+n]]
# [4, 3, 5, 8, 12, 2]

A 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])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...