Итак, я хочу создать список, который является подсписком какого-то существующего списка.
Например,
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
Но я хочу знать, есть ли другой способ сделать то же самое эффективно и за меньшее количество шагов.
Ответы:
Решение
Да, ты можешь:
И это все. Результат будет содержать элементы, размещенные в следующих позициях (на
0
основе -основе, поэтому первый элемент находится в позиции0
, второй в позиции и1
т. Д.):поэтому результат (фактические числа) будет:
Объяснение
В
[1::2]
конце - просто обозначение для нарезки списка. Обычно он бывает в следующем виде:Если мы не укажем
start
,0
будет использоваться default ( ). Таким образом, будет выбран первый элемент (в позиции0
, потому что индексы основаны на0
-основе). В этом случае будет выбран второй элемент.Поскольку второй элемент опущен, используется значение по умолчанию (конец списка). Итак, список перебирается от второго элемента до конца .
Мы также предоставили третий аргумент (
step
), который есть2
. Это означает, что один элемент будет выбран, следующий будет пропущен и так далее ...Итак, в данном случае
[1::2]
означает:step=2
, поэтому мы пропускаем один, а не поstep=1
умолчанию),EDIT : @PreetKukreti дал ссылку для другого объяснения нотации среза списка Python. См. Здесь: Объяснение нотации фрагментов Python
Дополнительно - замена счетчика на
enumerate()
В вашем коде вы явно создаете и увеличиваете счетчик. В Python в этом нет необходимости, так как вы можете перечислить некоторые итерации, используя
enumerate()
:Вышеупомянутое служит точно той же цели, что и код, который вы использовали:
Подробнее об эмуляции
for
циклов со счетчиком в Python: Доступ к индексу в Python циклов forисточник
(0,2,4,6)
; похоже, что OP хочет индексов(1,3,5)
, которые будут заданы[1,2,3,4,5,6,7][1::2]
.1
).list
нарезке Python . Он немного отличается, особенно потому, чтоlist
срез не сохраняет ссылку на исходный список (в Numarray вам нужно явно вызвать,.copy()
чтобы что-то не ссылалось на исходный массив). Но приятно иметь то, что может быть лучше для некоторых читателей. Не могли бы вы разместить эту ссылку в комментарии, чтобы я мог проголосовать за нее, и она появится сразу под ответом?Для нечетных позиций вам, вероятно, понадобится:
источник
Мне нравится понимание списка из-за его синтаксиса Math (Set). Так как насчет этого:
В основном, если вы перечисляете список, вы получаете индекс
x
и значениеy
. Что я здесь делаю, так это помещаю значениеy
в выходной список (четное или нечетное) и использую индекс,x
чтобы узнать, является ли эта точка нечетной (x%2 != 0
).источник
Вы можете использовать побитовый оператор AND
&
. Посмотрим ниже:Поразрядный оператор И используется с 1, и причина его работы в том, что нечетное число при записи в двоичном формате должно иметь первую цифру как 1. Давайте проверим
Операция AND с 1 вернет только 1 (1 в двоичном формате также будет иметь последнюю цифру 1), если значение нечетное.
Посетите страницу Python Bitwise Operator для получения дополнительной информации.
PS: Вы можете тактически использовать этот метод, если хотите выбрать нечетные и четные столбцы в фрейме данных. Скажем, координаты x и y ключевых точек лица заданы в виде столбцов x1, y1, x2 и т. Д. Чтобы нормализовать координаты x и y значениями ширины и высоты каждого изображения, вы можете просто выполнить
Это не совсем связано с вопросом, но для специалистов по данным и инженеров компьютерного зрения этот метод может быть полезен.
Ура!
источник
список_ = список (диапазон (9)) печать (список_ [1 :: 2])
источник