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


поэтому я хочу создать список, который является подсписком некоторого существующего списка.

например,

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 63

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] означает:

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