Pythonic列表切片具有可变步长?

时间:2019-06-11 06:45:36

标签: python list indexing

为说明这个问题,我们假设我在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], ...]

我对l[start:end:step_size]的Python索引表示法感到满意,并且我想知道是否存在一种方法可以在此表示法范式中为Python列表建立索引,并且步长在将每个索引添加到我的新索引后会有所不同切片列表。或者,我是否需要使用其他技术来解决之前提出的问题?

3 个答案:

答案 0 :(得分:2)

如果可以使用numpy,这真的很简单。

l = np.array([1, 2, 3, 4, ..., X])
fibs = np.array([0, 1, 2, 4, 7])
print(l[fibs])

答案 1 :(得分:2)

如果要从列表中检索多个元素,可以使用函数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 :(得分:1)

您可以首先编写一个生成斐波那契数字的生成器:

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())]