Select 列表中的每个第 n 个元素,n rational/non-integer

Select every nth element in list, with n rational/non-integer

int_list = list(range(1000))  # list [0, 1, 2, 3, 4, ..., 999]

现在我想 select 此列表中的每个第 n 个元素。 假设 n 是有理数。这里:n = 7/3 = 2.333...

因此,新列表的大小应约为原始列表的 42.85% (1/n)。 但我不希望元素被随机 selected。 selected 元素之间的间隙应该相似,但不需要始终完全相同。

结果可能会因您使用的算法不同而不同,只要满足要求,您可以选择算法。但是为了回答评论,这里有一个结果的例子:

int_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
out_list = [0, 2, 4, 8, 10]

out_list 的大小是 int_list 的 45.4545...%,不是 42.85%,但它是最接近的。

一种相当通用的方法,其中列表不必由 int 范围组成,并且合理值甚至可以小于 1:

N = 7
D = 3

k = 0
result = []
for i in int_list:
    k += D
    while k >= N:
        result.append(i)
        k -= N

按分母缩放范围,用分子步进,然后除以分母缩小范围:

>>> [i // 3 for i in range(0, 3 * 1000, 7)]
[0, 2, 4, 7, 9, 11, 14, 16, 18, 21, 23, 25, 28, 30, 32, 35, ..., 991, 994, 996, 998]

您的示例是一个范围,而不是列表。如果你真的有一个列表,那么只需使用我的数字作为索引,即,而不是 i // 3a[i // 3].

天真的想法是

from math import floor

def every_n(lst: list, n: int) -> list:
    l = [] 
    i = 0 
    while i < len(lst): 
        l.append(lst[floor(i)]) 
        i += n 
    return l
>>> every_n(range(1000), 7/3)
[0, 2, 4, 7, 9, 11, 14, 16, 18, 21, 23, 25, 28, 30, 32, 35, ..., 991, 994, 996, 998]