Estou tentando encontrar uma maneira curta de ver se algum dos itens a seguir está em uma lista, mas minha primeira tentativa não funciona. Além de escrever uma função para fazer isso, é uma maneira curta de verificar se um dos vários itens está em uma lista.
>>> a = [2,3,4]
>>> print (1 or 2) in a
False
>>> print (2 or 1) in a
True
a = [1, 2] b = [3, 5, 2, 6, 8, 9] c = [3, 5, 6, 8, 1, 9] print( (1 and 2) in b ,(2 and 1) in b ,(1 and 2) in c ,(2 and 1) in c, sep='\n')
é verdadeiro falso falso verdadeiro #Respostas:
As listas vazias e os conjuntos vazios são Falso, portanto, você pode usar o valor diretamente como um valor verdadeiro.
fonte
any
pode voltar mais cedo, assim que encontra umTrue
valor - ele não tem que construir toda a lista primeiraAh, Tobias, você me venceu. Eu estava pensando nessa pequena variação na sua solução:
fonte
x in long for x in short
vsx in short for x in long
)a
eb
têm o mesmo comprimento, máximo e mínimo irá retornar o mais à esquerda lista, o que torna aany()
chamada operar sobre a mesma lista em ambos os lados. Se você absolutamente requerem a verificação de comprimento, inverter a ordem das listas na segunda chamada:any(x in max(a, b, key=len) for x in (b, a, key=len))
.any(x in max(a, b, key=len) for x in min(b, a, key=len))
(perdeu o minuto).Talvez um pouco mais preguiçoso:
fonte
any
pode retornar mais cedo, enquanto sua versão precisa criar a lista inteira a partir da compreensão antes deany
poder usá-la. @ resposta de user89788 é um pouco melhor, porque os parênteses duplos são desnecessáriosPense no que o código realmente diz!
Isso provavelmente deve explicar isso. :) O Python aparentemente implementa "preguiçoso ou", o que não deve surpreender. Ele executa algo parecido com isto:
No primeiro exemplo,
x == 1
ey == 2
. No segundo exemplo, é vice-versa. É por isso que retorna valores diferentes, dependendo da ordem deles.fonte
Código versão de golfe. Considere usar um conjunto, se fizer sentido. Acho isso mais legível do que uma compreensão de lista.
fonte
1 linha sem compreensão de lista.
fonte
O melhor que pude apresentar:
fonte
No python 3, podemos começar a usar o asterisco descompactado. Dadas duas listas:
Edit: incorporar sugestão de alkanen
fonte
Quando você pensa em "verificar se a em b", pense em hashes (nesse caso, define). A maneira mais rápida é fazer o hash da lista que você deseja verificar e, em seguida, verifique cada item lá.
É por isso que a resposta de Joe Koberg é rápida: verificar a interseção do conjunto é muito rápido.
Porém, quando você não possui muitos dados, criar conjuntos pode ser uma perda de tempo. Assim, você pode fazer um conjunto da lista e apenas verificar cada item:
Quando o número de itens que você deseja verificar é pequeno, a diferença pode ser insignificante. Mas verifique muitos números em uma lista grande ...
testes:
velocidades:
O método que é consistentemente rápido é criar um conjunto (da lista), mas a interseção funciona melhor em grandes conjuntos de dados!
fonte
Em alguns casos (por exemplo, elementos de lista exclusivos), operações de conjunto podem ser usadas.
Ou, usando set.isdisjoint () ,
fonte
Isso fará isso em uma linha.
fonte
Reuni várias das soluções mencionadas em outras respostas e comentários e, em seguida, executei um teste de velocidade.
not set(a).isdisjoint(b)
acabou sendo o mais rápido, também não diminuiu muito quando o resultado foiFalse
.Cada uma das três execuções testa uma pequena amostra das configurações possíveis de
a
eb
. Os horários estão em microssegundos.fonte
Devo dizer que minha situação pode não ser o que você está procurando, mas pode fornecer uma alternativa ao seu pensamento.
Eu tentei o método set () e any (), mas ainda tenho problemas com a velocidade. Então, lembrei-me de Raymond Hettinger disse que tudo em python é um dicionário e use dict sempre que puder. Então foi isso que eu tentei.
Usei um defaultdict com int para indicar resultados negativos e usei o item na primeira lista como chave da segunda lista (convertida em defaultdict). Como você tem uma pesquisa instantânea com o dict, você sabe imediatamente se esse item existe no padrão. Sei que nem sempre é possível alterar a estrutura de dados para sua segunda lista, mas se você puder desde o início, será muito mais rápido. Pode ser necessário converter list2 (lista maior) em um padrão, onde key é o valor potencial que você deseja verificar na lista pequena e o valor é 1 (ocorrência) ou 0 (sem ocorrência, padrão).
fonte
Simples.
fonte
a
está na listab
.