Pythonic список нарезки с переменным размером шага? - PullRequest
3 голосов
/ 11 июня 2019

Чтобы сформулировать вопрос, давайте предположим, что у меня есть следующий список в Python, где X - это произвольно большое натуральное число:

l = [1, 2, 3, 4, 5, 6, 7, ... X]

И я хочу нарезать его так, чтобы я взял первыйвторой, третий, пятый, восьмой и т. д. элементы списка, соблюдая последовательность Фибоначчи.Например, операция, похожая на:

l_prime = [l[0], l[1], l[2], l[4], l[7], l[11], ...]

Мне комфортно с индексной нотацией Python, равной l[start:end:step_size], и мне интересно, есть ли способ индексировать списки Python в этой нотационной парадигме с размером шагаэто меняется после добавления каждого индекса в мой новый список.Или мне нужно будет использовать какую-то другую технику для решения поставленной мной ранее задачи?

Ответы [ 3 ]

2 голосов
/ 11 июня 2019

Если вы хотите извлечь несколько элементов из списка, вы можете использовать функцию itemgetter():

from operator import itemgetter

lst = [1, 2, 3, 4, 5, 6, 7, 8]
ind = [0, 0, 1, 2, 4, 7] 

itemgetter(*ind)(lst)
# (1, 1, 2, 3, 5, 8)
2 голосов
/ 11 июня 2019

Если вы можете использовать numpy, это действительно просто.

l = np.array([1, 2, 3, 4, ..., X])
fibs = np.array([0, 1, 2, 4, 7])
print(l[fibs])
1 голос
/ 11 июня 2019

Сначала вы можете написать генератор, который даст вам числа Фибоначчи:

def fibs():
    prev1 = 1
    prev2 = 2
    yield prev1
    yield prev2
    while True:
            prev1 += prev2
            prev2 += prev1
            yield prev1
            yield prev2

И затем вы можете использовать списки, чтобы сопоставить каждое из чисел Фибоначчи fib с l[fib - 1]:

import itertools
result = [l[fib - 1] for fib in itertools.takewhile(lambda x: x <= len(l), fibs())]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...