Python: Как каждый раз получать следующие k последовательных элементов массива? - PullRequest
0 голосов
/ 25 мая 2020

Я пытаюсь извлечь массив следующих K последовательных элементов из большего массива nK + d элементов. Где 0 и n> = 0 . Другими словами, при первой попытке я получу массив [: K], затем в следующий раз - массив [K: 2K] и так далее. В последней итерации все оставшиеся элементы Array [nK: nK + d], даже если количество оставшихся элементов меньше K. Во всех этих предыдущих операциях предпочтительно, чтобы исходный массив оставался нетронутым.

Например:

>>> arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> k_items = get_next_k(arr, k = 3)
>>> print(k_items)
  [1, 2, 3]
>>> k_items = get_next_k(arr, k = 3)
>>> print(k_items)
  [4, 5, 6]
>>> k_items = get_next_k(arr, k = 3)
>>> print(k_items)
  [7, 8, 9]
>>> k_items = get_next_k(arr, k = 3)
>>> print(k_items)
  [10]
>>> print(arr)
  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Есть ли простой и эффективный способ добиться этого?

Ответы [ 3 ]

0 голосов
/ 25 мая 2020

Вы можете попробовать следующее:

import math
def get_next_k(arr,k,idx):
  return arr[k*idx:k*idx+k]

arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
k = 3
no_of_iters = int(math.ceil(float(len(arr))/k))
for i in range(no_of_iters):
  print(get_next_k(arr,k,i)

Вывод

[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
[10]
0 голосов
/ 25 мая 2020

После небольшого мозгового штурма и веб-исследования у меня появилась идея, которая решает мою проблему с некоторой степенью простоты ....

Мой код: (get_k.py)

class klist(list):
    curKidx = 0

    def get_next_k(self, k = 1):
        list_len = self.__len__()
        if (self.curKidx + k) > list_len:
            k = list_len - self.curKidx
        retKlist = [list.__getitem__(self, idx) for idx in range( self.curKidx, (self.curKidx + k) )]
        self.curKidx = self.curKidx + k
        return retKlist

a = klist([1, 2, 3, 4, 5, 6, 7, 8, 9, 0])
print( a.get_next_k(3) )
print( a.get_next_k(3) )
print( a.get_next_k(3) )
print( a.get_next_k(3) )

Вывод:

# ./get_k.py 
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
[0]

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

Спасибо!

0 голосов
/ 25 мая 2020

Использование itertools.islice с выражением генератора

from itertools import islice

def get_next_k(curr, k):
    return list(islice(curr, k))

arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
curr = (x for x in arr)

for i in range(4):
    print(get_next_k(curr, 3))

Вывод:

[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
[10]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...