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

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

Например,

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 Solutions collect form web for “Извлечение элементов списка на нечетных позициях”

Решение

Да, ты можешь:

 l = L[1::2] 

И это все. Результат будет содержать элементы, размещенные в следующих положениях (на основе 0 , поэтому первый элемент находится в позиции 0 , второй – на 1 и т. Д.):

 1, 3, 5 

поэтому результат (фактические числа) будет:

 2, 4, 6 

объяснение

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

 some_list[start:stop:step] 

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

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

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

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

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

EDIT : @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 for

Для странных позиций вы, вероятно, хотите:

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

Мне нравятся представления List из-за их синтаксиса 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 ).

  • Назначение среза со строкой в ​​списке
  • Инвертировать срез в python
  • Как я должен обрабатывать включенные диапазоны в Python?
  • Python - случайным образом разбивает список на n почти равных частей
  • Нарезка списка на Python без создания копии
  • Как повысить индексный индекс, когда индексы среза выходят за пределы диапазона?
  • Эффективное извлечение памяти перекрывающихся патчей из матрицы
  • Почему индексирование массивов numpy с помощью скобок и запятых отличается поведением?
  • Python - лучший язык программирования в мире.