Извлечение элементов списка в нечетных позициях
поэтому я хочу создать список, который является подсписком некоторого существующего списка.
например,
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, второй на1etc.):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).