Создайте список чисел T * U и отфильтруйте все остальные в каждой ветви T, начиная с индекса 0 - PullRequest
0 голосов
/ 04 июня 2019

Я хочу создать массив чисел и получить только цифры зеленого цвета. Как я могу продолжить? img

Это для фильтрации определенных точек из массива в кузнечик носорога. Это то, что я пытался.

t = 4
u = 11
b = []

for i in range(t*u):
    if i % 2 == 0:
        b.append(i)
print(b)

Я хочу получить цифры (выделены зеленым цветом на изображении)

[0, 2, 4, 6, 8, 10, 11, 13, 15, 17, 19, 21, 22, 24, 26, 28, 30, 32, 33, 35, 37, 39, 41, 43]

не это

[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42]

Ответы [ 5 ]

1 голос
/ 04 июня 2019

Если вы хотите сделать это с помощью итерации, имеет смысл разбирать ее столбец за столбцом.

t = 4
u = 11
result = []
for col in range(t):
    result.extend(range(col*u, (col+1)*u, 2)) #run through 11 numbers starting from the offset of col*u (0*11, 1*11, 2*11 and so on) with an step size of 2.
print(result)
#Output:
[0, 2, 4, 6, 8, 10, 11, 13, 15, 17, 19, 21, 22, 24, 26, 28, 30, 32, 33, 35, 37, 39, 41, 43]
0 голосов
/ 04 июня 2019

Эта серия также может быть выражена как f (n) = 2n - n // 6

r = [2*i - i//6 for i in range(24)]

# [0, 2, 4, 6, 8, 10, 11, 13, 15, 17, 19, 21, 22, 24, 26, 28, 30, 32, 33, 35, 37, 39, 41, 43]
0 голосов
/ 04 июня 2019

Вы можете использовать:

t = 4
u = 11
b = [x for x in range(t*u) if (x%u)%2 == 0]

print(b)

ВЫВОД:

[0, 2, 4, 6, 8, 10, 11, 13, 15, 17, 19, 21, 22, 24, 26, 28, 30, 32, 33, 35, 37, 39, 41, 43]


ПОЯСНЕНИЯ:
Вы хотите диапазон от 0 до u.
Этот диапазон будет повторяться t раз.

Если вы считаете t == 1, вы хотите взять альтернативные номера. Поскольку вы всегда начинаете с 0, это означает все четные числа (то есть n%2 == 0).

Если бы у вас был второй цикл (t == 2), это был бы диапазон от 0+u до u+u. Поскольку мы хотим привести этот диапазон к известному условию (range(0,u)), поэтому мы можем применить n%2 == 0, мы делим на u каждое целое число в нашей итерации, так что остальные соответствуют значению на том же шаге в range(0,u).


Пример:

  • Мы можем взять все числа в полном диапазоне (t*u):

    full_range = [x for x in range(t*u)] # output: [0, 1, 2, 3, 4, 5,...43]

  • Сократить все эти числа до базового диапазона (range(0,u):

    basic_range = [y%u for y in full_range]

который выводит:

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

  • Проверьте четные числа:
    even_numbers = [z%2 == 0 for z in basic_range]

который выводит:

[True, False, True, False, True, False, True, False, True, False, True, True, False, True, False, True, False, True, False, True, False, True, True, False, True, False, True, False, True, False, True, False, True, True, False, True, False, True, False, True, False, True, False, True]


Вы можете видеть, что индексы с True - это те номера, которые вы хотите выбрать; поэтому, если вы примените эти условия к своему полному диапазону (range(0,t*u)) и выберете только целые числа, которые удовлетворяют вашим условиям, у вас будет список вашего номера.


В комментарии вы выразили необходимость пропустить также каждый 11-й номер.
следуя предыдущему объяснению, мы можем добавить условие (x%u) != 10:

[x for x in range(t*u) if (x%u)%2 == 0 and (x%u) != 10]

который выводит:

[0, 2, 4, 6, 8, 11, 13, 15, 17, 19, 22, 24, 26, 28, 30, 33, 35, 37, 39, 41]

0 голосов
/ 04 июня 2019

itertools.chain на помощь!

У вас есть 4 последовательные последовательности от 11 * i до 11 * (i + 1), шаг 2:

result = list(itertools.chain(*(range(11*i, 11*(i+1), 2) for i in range(4))))

Это дает:

[0, 2, 4, 6, 8, 10, 11, 13, 15, 17, 19, 21, 22, 24, 26, 28, 30, 32, 33, 35, 37, 39, 41, 43]
0 голосов
/ 04 июня 2019

[[i + 11*n for n in range(4)] for i in range(0, 11, 2)]

вернет:

[[0, 11, 22, 33],
 [2, 13, 24, 35],
 [4, 15, 26, 37],
 [6, 17, 28, 39],
 [8, 19, 30, 41],
 [10, 21, 32, 43]]

Если вы хотите, чтобы это было в одном простом списке, используйте itertools.chain :

list(itertools.chain.from_iterable(
    zip(*[
        [i + 11*n for n in range(4)]
        for i in range(0, 11, 2)
    ])
))

вернет:

[0, 2, 4, 6, 8, 10, 11, 13, 15, 17, 19, 21, 22, 24, 26, 28, 30, 32, 33, 35, 37, 39, 41, 43]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...