def common_elements(list1, list2):
"""
Return a list containing the elements which are in both list1 and list2
>>> common_elements([1,2,3,4,5,6], [3,5,7,9])
[3, 5]
>>> common_elements(['this','this','n','that'],['this','not','that','that'])
['this', 'that']
"""
for element in list1:
if element in list2:
return list(element)
Entendi isso até agora, mas não consigo fazê-lo funcionar!
Alguma ideia?
Respostas:
fonte
Você também pode usar conjuntos e obter os pontos comuns em uma linha: subtraia o conjunto que contém as diferenças de um dos conjuntos.
fonte
As soluções sugeridas por S. Marcos e SilentGhost geralmente dizer-lhe como ele deve ser feito de uma forma Pythonic, mas eu achei que você também pode se beneficiar de saber por que sua solução não funciona. O problema é que, assim que você encontrar o primeiro elemento comum nas duas listas, retornará apenas esse elemento único. Sua solução pode ser corrigida criando uma
result
lista e coletando os elementos comuns nessa lista:Uma versão ainda mais curta usando a compreensão da lista:
No entanto, como eu disse, essa é uma maneira muito ineficiente de fazer isso - os tipos de conjuntos internos do Python são muito mais eficientes à medida que são implementados em C internamente.
fonte
use interseções de conjunto, conjunto (lista1) e conjunto (lista2)
Observe que a lista de resultados pode ter uma ordem diferente da lista original.
fonte
você pode usar uma compreensão simples da lista:
fonte
Set é outra maneira de resolver isso
fonte
list1 = [1,2,3,4,5,6] list2 = [3,5,7,9]
Eu sei que três maneiras podem resolver isso, é claro, poderia haver mais.
1-
2-
3-
A terceira maneira é a mais rápida, pois os Sets são implementados usando tabelas de hash.
fonte
As respostas anteriores trabalham para encontrar os elementos comuns exclusivos, mas falham em levar em conta itens repetidos nas listas. Se você deseja que os elementos comuns apareçam no mesmo número que eles são encontrados em comum nas listas, você pode usar a seguinte linha:
A
or True
peça só é necessária se você espera que algum elemento avalieFalse
.fonte
set
que não é estável (ou seja, o pedido é perdido).Comparei cada método mencionado em cada resposta. Neste momento, uso o python 3.6.3 para esta implementação. Este é o código que eu usei:
Se você executar esse código, poderá ver que, se você usar lista ou gerador (se você iterar sobre um gerador, não apenas usá-lo. Fiz isso quando forcei o gerador a imprimir o comprimento dele), você obtém quase o mesmo desempenho. Mas se você usar o conjunto, obterá um desempenho muito melhor. Além disso, se você usar o método de interseção, obterá um desempenho um pouco melhor. o resultado de cada método no meu computador está listado abaixo:
fonte
esta é a minha proposta, acho que é mais fácil com conjuntos do que com um loop for
fonte
Por que não usar
list comprehension
?Solução de meia linha:
fonte
1) Método1: salvar lista1 é dicionário e, em seguida, iterar cada elem na lista2
Localizando elementos comuns e diferentes:
2) Method2 usando set
fonte
Use um gerador:
A vantagem aqui é que isso retornará em tempo constante (quase instantâneo), mesmo ao usar listas enormes ou outros iteráveis.
Por exemplo,
Todas as outras respostas aqui levarão muito tempo com esses valores para list1 e list2.
Você pode iterar a resposta com
Ou converta-o em uma lista com
fonte
for i in common: print(i)
. Geradores são iteráveis que são freqüentemente usados no lugar de outros iteráveis, como listas.