Então, eu quero criar uma lista que é uma sublista de alguma lista existente.
Por exemplo,
L = [1, 2, 3, 4, 5, 6, 7]
, Desejo criar uma sublista li
que li
contenha todos os elementos em L
posições ímpares.
Embora eu possa fazer isso
L = [1, 2, 3, 4, 5, 6, 7]
li = []
count = 0
for i in L:
if count % 2 == 1:
li.append(i)
count += 1
Mas eu quero saber se existe outra maneira de fazer o mesmo com eficiência e em menos número de etapas.
Respostas:
Solução
Sim você pode:
E isso é tudo. O resultado conterá os elementos colocados nas seguintes posições (
0
com base em, portanto, o primeiro elemento está na posição0
, o segundo em1
etc.):então o resultado (números reais) será:
Explicação
O
[1::2]
no final é apenas uma notação para divisão de lista. Normalmente tem o seguinte formato:Se omitimos
start
, o default (0
) seria usado. Portanto, o primeiro elemento (na posição0
, porque os índices são0
baseados) seria selecionado. Neste caso, o segundo elemento será selecionado.Como o segundo elemento foi omitido, o padrão está sendo usado (o final da lista). Portanto, a lista está sendo iterada do segundo elemento até o final .
Também fornecemos o terceiro argumento (
step
), que é2
. O que significa que um elemento será selecionado, o próximo será ignorado e assim por diante ...Então, para resumir, neste caso
[1::2]
significa:step=2
, então estamos pulando um, ao contrário dostep=1
que é padrão),EDIT : @PreetKukreti forneceu um link para outra explicação sobre a notação de fatiamento de lista do Python. Veja aqui: Explique a notação de fatia do Python
Extras - substituindo contador com
enumerate()
Em seu código, você cria e aumenta explicitamente o contador. Em Python, isso não é necessário, pois você pode enumerar por meio de alguns iteráveis usando
enumerate()
:O acima tem exatamente a mesma finalidade que o código que você estava usando:
Mais sobre emulação de
for
loops com contador em Python: Acessando o índice em Python 'for' loopsfonte
(0,2,4,6)
; parece que o OP deseja índices(1,3,5)
, que seriam dados por[1,2,3,4,5,6,7][1::2]
.1
).list
fatiamento do Python . É um pouco diferente, especialmente porque alist
fatia de não mantém referência à lista original (em Numarray você precisa chamar explicitamente.copy()
para ter algo que não faça referência ao array original). Mas é bom ter algo que pode ser melhor para alguns leitores. Você se importaria de colocar este link no comentário, para que eu possa votar a favor e ele aparecerá logo abaixo da resposta?Para as posições ímpares , você provavelmente deseja:
fonte
Eu gosto de compreensões de lista por causa de sua sintaxe Math (Set). Então, que tal isso:
Basicamente, se você enumerar em uma lista, obterá o índice
x
e o valory
. O que estou fazendo aqui é colocar o valory
na lista de saída (par ou ímpar) e usar o índicex
para descobrir se esse ponto é ímpar (x%2 != 0
).fonte
Você pode fazer uso do operador AND bit a bit
&
. Vamos ver abaixo:O operador AND bit a bit é usado com 1, e o motivo pelo qual funciona é que, o número ímpar quando escrito em binário deve ter seu primeiro dígito como 1. Vamos verificar
A operação AND com 1 retornará apenas 1 (1 em binário também terá o último dígito 1), se o valor for ímpar.
Verifique a página do Python Bitwise Operator para mais informações.
PS: Você pode usar esse método taticamente se quiser selecionar colunas ímpares e pares em um dataframe. Digamos que as coordenadas xey dos pontos-chave faciais sejam dadas como colunas x1, y1, x2, etc ... Para normalizar as coordenadas xey com os valores de largura e altura de cada imagem, você pode simplesmente executar
Isso não está exatamente relacionado à questão, mas para cientistas de dados e engenheiros de visão computacional, esse método pode ser útil.
Felicidades!
fonte
lista_ = lista (intervalo (9)) impressão (lista_ [1 :: 2])
fonte