a = [1,2,3,4,5]
b = [1,3,5,6]
c = a and b
print c
saída real: [1,3,5,6]
saída esperada:[1,3,5]
Como podemos obter uma operação AND booleana (interseção de lista) em duas listas?
python
arrays
intersection
csguy11
fonte
fonte
a and b
funciona como a seguinte declaração da documentação a menciona: " A expressãox and y
primeiro avaliax
; sex
for falsa, seu valor é retornado; caso contrário,y
é avaliado e o valor resultante é retornado. "Respostas:
Se o pedido não for importante e você não precisar se preocupar com duplicatas, poderá usar a interseção definida:
fonte
a = [1,1,2,3,4,5]
eb = [1,1,3,5,6]
, em seguida, o cruzamento é[1,1,3,5]
, mas pelo método acima que irá resultar em apenas um1
ou seja,[1, 3, 5]
o que vai ser a forma escrita para fazê-lo, então?intersection
é comumente entendido como definido com base. Você está procurando um animal um pouco diferente - e pode ser necessário fazer isso manualmente, classificando cada lista e mesclando os resultados - e mantendo os dups na mescla.Usar a compreensão da lista é bastante óbvio para mim. Não tenho certeza do desempenho, mas pelo menos as coisas permanecem na lista.
[x for x in a if x in b]
Ou "todos os valores x que estão em A, se o valor X estiver em B".
fonte
b
um conjunto e você terá que O (n)Se você converter a maior das duas listas em um conjunto, poderá obter a interseção desse conjunto com qualquer iterável usando
intersection()
:fonte
list(set(a) & set(b))
Faça um conjunto do maior:
Então,
fará o que você quer (preservar
b
a ordem, nãoa
é - não pode necessariamente preservar as duas ) e fará rápido . (Usarif x in a
como condição na compreensão da lista também funcionaria e evitaria a necessidade de criar_auxset
, mas infelizmente para listas de tamanho substancial seria muito mais lento).Se você deseja que o resultado seja classificado, em vez de preservar a ordem das duas listas, uma maneira ainda mais organizada pode ser:
fonte
Aqui está um código Python 2 / Python 3 que gera informações de tempo para os métodos baseados em listas e em conjuntos de encontrar a interseção de duas listas.
Os algoritmos de compreensão pura da lista são O (n ^ 2), pois
in
em uma lista há uma pesquisa linear. Os algoritmos baseados em conjuntos são O (n), pois a pesquisa de conjuntos é O (1) e a criação de conjuntos é O (n) (e a conversão de um conjunto em uma lista também é O (n)). Portanto, para n suficientemente grandes, os algoritmos baseados em conjuntos são mais rápidos, mas para pequenos n as despesas gerais da criação dos conjuntos os tornam mais lentos que os algoritmos de compilação de lista pura.resultado
Gerado usando uma máquina de núcleo único de 2 GHz com 2 GB de RAM executando o Python 2.6.6 em uma versão Debian do Linux (com o Firefox sendo executado em segundo plano).
Esses números são apenas um guia aproximado, pois as velocidades reais dos vários algoritmos são afetadas de maneira diferente pela proporção de elementos que estão nas duas listas de fontes.
fonte
Deveria funcionar como um sonho. E, se puder, use conjuntos em vez de listas para evitar todas essas alterações de tipo!
fonte
Uma maneira funcional pode ser conseguida utilizando
filter
elambda
operador.Editar: filtra x que existe na lista1 e na lista, a diferença de conjunto também pode ser obtida usando:
Edit2: python3
filter
retorna um objeto de filtro, encapsulando-o comlist
retorna a lista de saída.fonte
list(filter(lambda x:x in list1, list2))
para obtê-lo como uma lista.Este é um exemplo em que você precisa Cada elemento no resultado deve aparecer quantas vezes for mostrado nas duas matrizes.
fonte
Pode ser tarde, mas achei que deveria compartilhar para o caso em que você é obrigado a fazê-lo manualmente (mostrar trabalho - haha) OU quando você precisar que todos os elementos apareçam o máximo de vezes possível ou quando você também precisar que seja exclusivo .
Por favor, note que os testes também foram escritos para isso.
fonte
Se, por Booleano AND, você quer dizer itens que aparecem nas duas listas, por exemplo, interseção, deve procurar os tipos
set
efrozenset
tipos de Python .fonte
Você também pode usar um contador! Ele não preserva o pedido, mas considera as duplicatas:
fonte