Извлечение элементов списка в нечетных позициях

Итак, я хочу создать список, который представляет собой подсписок какого-то уже существующего списка.

например,

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-based, поэтому первый элемент находится в позиции 0, второй на 1 etc.):

1, 3, 5

таким образом, результат (реальные цифры) будет:

2, 4, 6

объяснение

на [1::2] в конце-это просто обозначение для нарезки. Обычно это происходит в следующем форма:

some_list[start:stop:step]

если мы опустим start по умолчанию (0) будет использоваться. Итак, первый элемент (в позиции 0, потому что индексы 0 - based) будет выбран. В этом случае будет выбран второй элемент.

поскольку второй элемент опущен, используется значение по умолчанию (конец списка). Поэтому список перебирается со второго элемента до конца.

мы также предоставили третий аргумент (step), которая 2. Это означает, что один элемент будет выбран, следующий будет пропущен, и так далее...

Итак, подводя итог, в данном случае [1::2] означает:

  1. возьмите второй элемент (который, кстати, является нечетным элементом, если судить по индексу),
  2. пропустить один элемент (потому что у нас есть step=2, поэтому мы пропускаем один, в отличие от step=1 по умолчанию),
  3. сделать следующий элемент
  4. повторите шаги 2.-3. до конца списка дошел,

редактировать: @PreetKukreti дал ссылку для другого объяснения в нотации нарезки списка Python. Смотрите здесь: объясните обозначение среза Python

дополнительно - замена счетчика с enumerate()

в коде вы явно создаете и увеличиваете счетчик. В Python это не нужно, так как вы можете перечислить через iterable с использованием 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


на odd позиции, вы, вероятно, хотите:

>>>> list_ = list(range(10))
>>>> print list_[1::2]
[1, 3, 5, 7, 9]
>>>>

мне нравится понимание списка из-за их синтаксиса Math (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).