Выберите каждый n-й элемент в списке с n рациональными / нецелыми числами - PullRequest
1 голос
/ 07 августа 2020
int_list = list(range(1000))  # list [0, 1, 2, 3, 4, ..., 999]

Теперь я хочу выбрать каждый n-й элемент из этого списка. Предположим, что n рационально. Здесь: n = 7/3 = 2,333 ...

Размер нового списка, следовательно, должен составлять около 42,85% (1 / n) от исходного. Но я не хочу, чтобы элементы выбирались случайным образом. Разрыв между выбранными элементами должен быть одинаковым, но не обязательно, чтобы он всегда был одинаковым.

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

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

Размер out_list составляет 45,4545 ...% от int_list, что не 42 , 85%, но это ближайшее возможное значение

Ответы [ 3 ]

3 голосов
/ 07 августа 2020

Масштабирование диапазона по знаменателю, переход с числителем и уменьшение обратно путем деления на знаменатель:

>>> [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 do a[i // 3].

1 голос
/ 07 августа 2020

Наивный дубль будет

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]
1 голос
/ 07 августа 2020

Довольно общий c подход, когда список не обязательно должен состоять из диапазона int и где рациональное значение может быть даже меньше единицы:

N = 7
D = 3

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