Извлечение элементов списка в нечетных позициях
поэтому я хочу создать список, который является подсписком некоторого существующего списка.
например,
L = [1, 2, 3, 4, 5, 6, 7]
, Я хочу создать подсписок li
такое, что li
содержит все элементы L
на нечетных позициях.
пока я могу сделать это с помощью
L = [1, 2, 3, 4, 5, 6, 7]
li = []
count = 0
for i in L:
if count % 2 == 1:
li.append(i)
count += 1
но я хочу знать, есть ли другой способ сделать то же самое эффективно и за меньшее количество шагов.
3 ответа:
решение
Да, вы можете:
l = L[1::2]
и это все. Результат будет содержать элементы, расположенные на следующих позициях (
0
-на основе, так что первый элемент находится в позиции0
, второй на1
etc.):1, 3, 5
таким образом, результат (реальные цифры) будет:
2, 4, 6
объяснение
The
[1::2]
в конце-это просто обозначение для нарезки. Обычно это происходит в следующем форма:some_list[start:stop:step]
если мы опустим
start
по умолчанию (0
) будет использоваться. Итак, первый элемент (в позиции0
, потому что индексы0
- based) будет выбран. В этом случае будет выбран второй элемент.поскольку второй элемент опущен, используется значение по умолчанию (конец списка). Так что список повторяется со второго элемента до конца.
мы также предоставили третий аргумент (
step
), которая2
. Это означает, что один элемент будет выбран, следующий будет пропущен, и так далее...Итак, подведем итог, в данном случае
[1::2]
означает:
- возьмите второй элемент (который, кстати, является нечетным элементом, если судить по индексу),
- пропустить один элемент (потому что у нас есть
step=2
, так что мы пропускаем один, в отличие отstep=1
по умолчанию),- сделать следующий элемент
- повторите шаги 2.-3. пока не будет достигнут конец списка,
EDIT: @PreetKukreti дал ссылку для другого объяснения в списке нарезки нотации Python. Смотрите здесь: объясните нотацию среза питона
дополнительно - замена счетчика с
enumerate()
в коде вы явно создаете и увеличиваете счетчик. В Python это не нужно, так как вы можете перечислить через повторяемое с помощью
enumerate()
:for count, i in enumerate(L): if count % 2 == 1: l.append(i)
вышеизложенное служит точно такой же цели, как и код, который вы использовали:
count = 0 for i in L: if count % 2 == 1: l.append(i) count += 1
подробнее об эмуляции
for
циклы со счетчиком в Python: доступ к индексу в Python' for ' loops
на странно позиции, вы, вероятно, хотите:
>>>> list_ = list(range(10)) >>>> print list_[1::2] [1, 3, 5, 7, 9] >>>>
мне нравится список постижений из-за их математического (Set) синтаксиса. Так как насчет этого:
L = [1, 2, 3, 4, 5, 6, 7] odd_numbers = [y for x,y in enumerate(items) if x%2 != 0] even_numbers = [y for x,y in enumerate(items) if x%2 == 0]
в принципе, если вы перечисляете по списку, вы получите индекс
x
и значениеy
. То, что я делаю здесь, это положить значениеy
в выходной список (четный или нечетный) и с помощью индексаx
чтобы узнать, является ли эта точка нечетной (x%2 != 0
).