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 // 3
做 a[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]
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 // 3
做 a[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]