No Python, qual é a melhor maneira de calcular a diferença entre duas listas?
exemplo
A = [1,2,3,4]
B = [2,5]
A - B = [1,3,4]
B - A = [5]
Use set
se você não se importa com ordem ou repetição de itens. Use a compreensão da lista se você:
>>> def diff(first, second):
second = set(second)
return [item for item in first if item not in second]
>>> diff(A, B)
[1, 3, 4]
>>> diff(B, A)
[5]
>>>
set(b)
para assegurar o algoritmo é O (nlogn) em vez de teta (n ^ 2)set
inscrição em B é inofensiva, mas aplicá-laA
e usar o resultado em vez do originalA
não é.Se o pedido não importa, você pode simplesmente calcular a diferença definida:
fonte
Você pode fazer um
e
fonte
Um forro:
Ou:
fonte
Os exemplos acima banalizaram o problema de calcular diferenças. Supondo que a classificação ou desduplicação definitivamente facilite a computação da diferença, mas se sua comparação não puder permitir essas suposições, você precisará de uma implementação não trivial de um algoritmo diff. Veja difflib na biblioteca padrão do python.
A - B = [[1, 3, 4]]
fonte
print
mudou a partir de um comando para uma função, ereduce
,filter
emap
foram declarados unpythonic. (E eu acho Guido pode estar certo - Eu não entendo o quereduce
faz, também.)Python 2.7.3 (padrão, 27 de fevereiro de 2014, 19:58:35) - IPython 1.1.0 - timeit: (github gist)
Resultados:
A função de compreensão de lista roman-bodnarchuk def def diff (a, b) parece ser mais rápida.
fonte
fonte
Você gostaria de usar um em
set
vez de umlist
.fonte
Caso você queira que a diferença entre nos itens da sua lista recursivamente, escrevi um pacote para python: https://github.com/erasmose/deepdiff
Instalação
Instale a partir do PyPi:
Se você é Python3, também precisa instalar:
Exemplo de uso
O mesmo objeto retorna vazio
O tipo de um item foi alterado
O valor de um item foi alterado
Item adicionado e / ou removido
Diferença de cadeia
Diferença de string 2
Alteração de tipo
Diferença de lista
Diferença de lista 2: observe que NÃO leva em conta a ordem
Lista que contém o dicionário:
fonte
maneira mais simples,
use set (). diferença (set ())
a resposta é
set([1])
fonte
No caso de uma lista de dicionários , a solução completa de compreensão da lista funciona enquanto a
set
solução geraCaso de teste
fonte
Código simples que fornece a diferença com vários itens, se você desejar:
fonte
Ao examinar o TimeComplexity do operador interno , na pior das hipóteses, ele funciona com O (n). Mesmo para conjuntos.
Portanto, ao comparar duas matrizes, teremos uma TimeComplexity de O (n) no melhor dos casos e O (n ^ 2) no pior dos casos.
Uma solução alternativa (mas infelizmente mais complexa), que funciona com O (n) na melhor e na pior das hipóteses, é esta:
por exemplo
fonte