Eu tenho duas listas em Python, como estas:
temp1 = ['One', 'Two', 'Three', 'Four']
temp2 = ['One', 'Two']
Preciso criar uma terceira lista com itens da primeira lista que não estão presentes na segunda. Do exemplo que tenho que obter:
temp3 = ['Three', 'Four']
Existem maneiras rápidas sem ciclos e verificação?
python
performance
list
set
set-difference
Max Frai
fonte
fonte
temp1 = ['One', 'One', 'One']
etemp2 = ['One']
deseja['One', 'One']
voltar, ou[]
?Respostas:
Cuidado que
onde você pode esperar / querer que seja igual
set([1, 3])
. Se você quiserset([1, 3])
como sua resposta, precisará usá-loset([1, 2]).symmetric_difference(set([2, 3]))
.fonte
TypeError: 'str' object is not callable
quando eu executar esta operaçãoa = [1,2,2,2,3]
eb = [2]
Todas as soluções existentes oferecem um ou outro de:
Mas até agora nenhuma solução tem os dois. Se você quer os dois, tente o seguinte:
Teste de performance
Resultados:
O método que apresentei, além de preservar a ordem, também é (um pouco) mais rápido que a subtração do conjunto, pois não requer a construção de um conjunto desnecessário. A diferença de desempenho seria mais perceptível se a primeira lista for consideravelmente maior que a segunda e se o hash for caro. Aqui está um segundo teste demonstrando isso:
Resultados:
fonte
fonte
temp2
em um conjunto antes tornaria isso um pouco mais eficiente.item not in temp2
eitem not in set(temp2)
sempre retornará os mesmos resultados, independentemente de haver duplicatas ou nãotemp2
.A diferença entre duas listas (por exemplo, lista1 e lista2) pode ser encontrada usando a seguinte função simples.
ou
Usando a função acima, a diferença pode ser encontrada usando
diff(temp2, temp1)
oudiff(temp1, temp2)
. Ambos vão dar o resultado['Four', 'Three']
. Você não precisa se preocupar com a ordem da lista ou com qual lista deve ser fornecida primeiro.Referência do Documento Python
fonte
Caso você queira a diferença recursivamente, escrevi um pacote para python: https://github.com/seperman/deepdiff
Instalação
Instale a partir do PyPi:
Exemplo de uso
Importando
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 cadeia 2
Alteração de tipo
Diferença de lista
Diferença de lista 2:
Listar a diferença de ordem de ignição ou duplicatas: (com os mesmos dicionários acima)
Lista que contém o dicionário:
Conjuntos:
Tuplas nomeadas:
Objetos personalizados:
Atributo de objeto adicionado:
fonte
Pode ser feito usando o operador python XOR.
fonte
maneira mais simples,
use set (). diferença (set ())
a resposta é
set([1])
pode imprimir como uma lista,
fonte
Se você está realmente olhando para o desempenho, use numpy!
Aqui está o caderno completo como uma essência no github com comparação entre list, numpy e pandas.
https://gist.github.com/denfromufa/2821ff59b02e9482be15d27f2bbd4451
fonte
eu irei falar, já que nenhuma das soluções presentes produz uma tupla:
alternativamente:
Como as outras respostas que não são da tupla, nessa direção, ele preserva a ordem
fonte
Eu queria algo que levaria duas listas e poderia fazer o que
diff
nosbash
faz. Como essa pergunta aparece primeiro quando você pesquisa "python diff two lists" e não é muito específica, vou postar o que foi apresentado.Usando
SequenceMather
fromdifflib
você pode comparar duas listas comodiff
faz. Nenhuma das outras respostas lhe dirá a posição em que a diferença ocorre, mas essa sim. Algumas respostas dão a diferença em apenas uma direção. Alguns reordenam os elementos. Alguns não lidam com duplicatas. Mas esta solução oferece uma verdadeira diferença entre duas listas:Isso gera:
Obviamente, se seu aplicativo fizer as mesmas suposições que as outras respostas, você se beneficiará mais delas. Mas se você estiver procurando por uma verdadeira
diff
funcionalidade , esse é o único caminho a percorrer.Por exemplo, nenhuma das outras respostas poderia lidar com:
Mas este faz:
fonte
Tente o seguinte:
fonte
isso pode ser ainda mais rápido do que a compreensão da lista de Mark:
fonte
from itertools import filterfalse
aqui. Observe também que isso não retorna uma sequência como as outras, mas retorna um iterador.Aqui está uma
Counter
resposta para o caso mais simples.Isso é mais curto do que o descrito acima, que difere nos dois sentidos, porque ele faz exatamente o que a pergunta faz: gerar uma lista do que está na primeira lista, mas não na segunda.
Como alternativa, dependendo das suas preferências de legibilidade, cria uma linha decente decente:
Resultado:
Observe que você pode remover a
list(...)
chamada se estiver apenas repetindo.Como esta solução usa contadores, ela lida com quantidades adequadamente versus as muitas respostas baseadas em conjuntos. Por exemplo nesta entrada:
A saída é:
fonte
Você poderia usar um método ingênuo se os elementos da lista de distribuição forem classificados e configurados.
ou com métodos de conjunto nativo:
Solução ingênua: 0.0787101593292
Solução do conjunto nativo: 0.998837615564
fonte
Estou muito atrasado no jogo para isso, mas você pode fazer uma comparação do desempenho de alguns dos códigos mencionados acima com isso, dois dos concorrentes mais rápidos são:
Peço desculpas pelo nível elementar de codificação.
fonte
Aqui estão alguns exemplos simples de preservação de pedidos maneiras de diferenciar duas listas de strings.
Código
Uma abordagem incomum usando
pathlib
:Isso pressupõe que ambas as listas contêm seqüências de caracteres com começos equivalentes. Veja os documentos para mais detalhes. Observe que não é particularmente rápido se comparado às operações definidas.
Uma implementação direta usando
itertools.zip_longest
:fonte
temp1
etemp2
alinhados. Se, por exemplo, você inverter os elementostemp2
ou inserir algum outro valor no início detemp2
, o listcomp retornará os mesmos elementos que emtemp1
Esta é outra solução:
fonte
Se você se deparar,
TypeError: unhashable type: 'list'
precisará transformar listas ou conjuntos em tuplas, por exemploVeja também Como comparar uma lista de listas / conjuntos em python?
fonte
Digamos que temos duas listas
podemos ver nas duas listas acima que os itens 1, 3, 5 existem na lista2 e os itens 7, 9 não. Por outro lado, os itens 1, 3, 5 existem na lista1 e os itens 2, 4 não.
Qual é a melhor solução para retornar uma nova lista contendo os itens 7, 9 e 2, 4?
Todas as respostas acima encontram a solução, agora qual é a melhor opção?
versus
Usando timeit, podemos ver os resultados
retorna
fonte
versão de linha única da solução arulmr
fonte
se você quiser algo mais como um changeset ... poderia usar o Counter
fonte
Podemos calcular a interseção menos a união de listas:
fonte
Isso pode ser resolvido com uma linha. A pergunta é dada duas listas (temp1 e temp2) retornam sua diferença em uma terceira lista (temp3).
fonte
Aqui está uma maneira simples de distinguir duas listas (qualquer que seja o conteúdo), você pode obter o resultado conforme mostrado abaixo:
Espero que isso seja útil.
fonte
Eu prefiro usar a conversão para conjuntos e, em seguida, usando a função "diferença ()". O código completo é:
Resultado:
É o mais fácil de entender e, no futuro, se você trabalhar com dados grandes, convertê-los em conjuntos removerá duplicatas, caso não sejam necessárias. Espero que ajude ;-)
fonte
fonte
por exemplo, se
list1 = [10, 15, 20, 25, 30, 35, 40]
elist2 = [25, 40, 35]
então a lista retornada seráoutput = [10, 20, 30, 15]
fonte