Или, более общий вопрос: как отрезать массив, чтобы получить каждую n-ю строку, поэтому для четного/нечетного вы хотите пропустить одну строку, но в общем случае вы хотите получить каждая n-я строка, пропуская n-1 строки.
Самый короткий способ разрезать четные/нечетные строки из массива python?
Ответ 1
Предполагая, что вы говорите о списке, вы указываете шаг в срезе (и начинаете индекс). Синтаксис list[start:end:step]
.
Вероятно, вы знаете доступ к обычным спискам для получения элемента, например. l[2]
, чтобы получить третий элемент. Предоставляя два числа и двоеточие между ними, вы можете указать диапазон, который вы хотите получить из списка. Возвращаемое значение - это другой список. Например. l[2:5]
дает вам третий-шестой элемент. Вы также можете передать дополнительный третий номер, который определяет размер шага. Размер шага по умолчанию - один, что означает только каждый элемент (между начальным и конечным индексом).
Пример:
>>> l = range(10)
>>> l[::2] # even - start at the beginning at take every second item
[0, 2, 4, 6, 8]
>>> l[1::2] # odd - start at second item and take every second item
[1, 3, 5, 7, 9]
Если вы хотите получить каждый n
-й элемент списка (т.е. исключая первый элемент), вам нужно нарезать как l[(n-1)::n]
.
Пример:
>>> l = range(20)
>>> l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
Теперь, каждый третий элемент будет выглядеть следующим образом:
>>> l[2::3]
[2, 5, 8, 11, 14, 17]
Если вы хотите включить первый элемент, просто выполните l[::n]
.
Ответ 2
Это больше для меня как полный пример;)
>>> import itertools
>>> ret = [[1,2], [3,4,5,6], [7], [8,9]]
>>> itertools.izip_longest(*ret)
>>> [x for x in itertools.chain.from_iterable(tmp) if x is not None]
[1, 3, 7, 8, 2, 4, 9, 5, 6]
Ответ 3
> map(lambda index: arr[index],filter(lambda x: x%n == 0,range(len(arr))))
где arr
- список, а n
- фрагменты.