Como concatenar duas listas no Python?
Exemplo:
listone = [1, 2, 3]
listtwo = [4, 5, 6]
Resultado esperado:
>>> joinedlist
[1, 2, 3, 4, 5, 6]
python
list
concatenation
y2k
fonte
fonte
[1,2,5] and [2,4,5,6]
? Deseja que as duplicatas sejam incluídas, excluídas ou não se importam?Respostas:
Você pode usar o
+
operador para combiná-los:Resultado:
fonte
listone += listtwo
resulta emlistone == [1, 2, 3, 4, 5, 6]
list3 = listone
listone+=listtwo
lista3 também mudou?Também é possível criar um gerador que simplesmente itere sobre os itens nas duas listas usando
itertools.chain()
. Isso permite que você encadeie listas (ou qualquer iterável) juntas para processamento sem copiar os itens para uma nova lista:fonte
chain
está no lado mais lento (mas não muito) para duas listas, mas é a solução mais rápida para encadear várias listas (n >> 2).>= 3.5
Alternativa Python :[*l1, *l2]
Outra alternativa foi introduzida através da aceitação da
PEP 448
qual merece menção.O PEP, intitulado Generalizações adicionais de desempacotamento , geralmente reduzia algumas restrições sintáticas ao usar a
*
expressão estrelada em Python; Agora, a junção de duas listas (aplicável a qualquer iterável) agora também pode ser feita com:Essa funcionalidade foi definida para o Python
3.5
e não foi suportada para versões anteriores da3.x
família. Nas versões não suportadas, umSyntaxError
será gerado.Como nas outras abordagens, isso também cria uma cópia superficial dos elementos nas listas correspondentes.
A vantagem dessa abordagem é que você realmente não precisa de listas para executá-la, qualquer coisa iterável fará. Como afirmado no PEP:
Portanto, enquanto a adição com
+
aumentaria umaTypeError
incompatibilidade de tipo:O seguinte não:
porque primeiro descompactará o conteúdo dos iterables e, em seguida, simplesmente criará um a
list
partir do conteúdo.fonte
res = [*l1, *reversed(l2)]
. Desdereversed
retorna um iterador,res = l1 + reversed(l2)
lançaria um erro.Você pode usar conjuntos para obter uma lista mesclada de valores exclusivos
fonte
listone + [x for x in listtwo if x not in listone]
import collections; mergedlist = list(collections.OrderedDict.fromkeys(listone + listtwo))
fará o truque.Você também pode usar o
list.extend()
método para adicionar umlist
ao final de outro:Se você deseja manter intacta a lista original, é possível criar um novo
list
objeto e asextend
duas listas:fonte
A partir da versão 3.7, esses são os métodos stdlib mais populares para concatenar duas (ou mais) listas em python.
atuação
Concatenação de 2 listas 1
Não há muita diferença entre esses métodos, mas isso faz sentido, pois todos eles têm a mesma ordem de complexidade (linear). Não há nenhuma razão específica para preferir uma à outra, exceto por uma questão de estilo.
Concatenação da lista N
Gráficos foram gerados usando o módulo perfplot . Código, para sua referência.
1. Os métodos
iadd
(+=
) eextend
operam no local; portanto, uma cópia deve ser gerada todas as vezes antes do teste. Para manter as coisas justas, todos os métodos têm uma etapa de pré-cópia para a lista da esquerda que pode ser ignorada.Comentários sobre Outras Soluções
NÃO UTILIZE O MÉTODO DUNDER
list.__add__
diretamente de forma alguma. De fato, evite métodos obscuros e use os operadores eoperator
funções para os quais foram projetados. O Python possui semântica cuidadosa incorporada a elas, que são mais complicadas do que apenas chamar o dunder diretamente. Aqui está um exemplo . Então, para resumir,a.__add__(b)
=> MAU;a + b
=> BOM.Algumas respostas aqui oferecem
reduce(operator.add, [a, b])
concatenação aos pares - isso é o mesmo quesum([a, b], [])
apenas mais prolixo.Qualquer método que utiliza
set
descarta duplicatas e perde pedidos. Use com cuidado.for i in b: a.append(i)
é mais prolixo e mais lento quea.extend(b)
, que é chamada de função única e mais idiomático.append
é mais lento devido à semântica com a qual a memória é alocada e aumentada para listas. Veja aqui para uma discussão semelhante.heapq.merge
funcionará, mas seu caso de uso é para mesclar listas classificadas em tempo linear. Usá-lo em qualquer outra situação é um anti-padrão.yield
A entrada de elementos de lista de uma função é um método aceitável, maschain
é mais rápido e melhor (ele possui um caminho de código em C, portanto é rápido).operator.add(a, b)
é um equivalente funcional aceitável paraa + b
. Seus casos de uso são principalmente para envio de método dinâmico. Caso contrário, prefiro oa + b
que é mais curto e mais legível, na minha opinião . YMMV.fonte
"There's not much difference between these methods but that makes sense given they all have the same order of complexity (linear). There's no particular reason to prefer one over the other except as a matter of style.
"Soluções não listadas na minha resposta ou criticadas em" Comentários "eu recomendo não usar.Isso é bem simples e acho que foi mostrado no tutorial :
fonte
Esta pergunta pergunta diretamente sobre a junção de duas listas. No entanto, é bastante alto na pesquisa, mesmo quando você está procurando uma maneira de ingressar em muitas listas (incluindo o caso ao ingressar em zero listas).
Eu acho que a melhor opção é usar a compreensão da lista:
Você também pode criar geradores:
Resposta antiga
Considere esta abordagem mais genérica:
Saída:
Observe que isso também funciona corretamente quando
a
é[]
ou[[1,2,3]]
.No entanto, isso pode ser feito de forma mais eficiente com
itertools
:Se você não precisa de um
list
, mas apenas de um iterável, omitalist()
.Atualizar
A alternativa sugerida por Patrick Collins nos comentários também pode funcionar para você:
fonte
reduce
agora está nofunctools
modo , então você precisará importá-lo primeiro.Você pode simplesmente usar o operador
+
ou da+=
seguinte maneira:Ou:
Além disso, se você deseja que os valores na lista mesclada sejam exclusivos, você pode:
fonte
list(dict.fromkeys(a + b))
Vale ressaltar que a
itertools.chain
função aceita número variável de argumentos:Se uma iterável (tupla, lista, gerador, etc.) for a entrada, o
from_iterable
método da classe pode ser usado:fonte
Com o Python 3.3+, você pode usar o rendimento de :
Ou, se você deseja oferecer suporte a um número arbitrário de iteradores:
fonte
itertools.chain
(que é equivalente) em vez de definir sua própria função.Se você deseja mesclar as duas listas na forma classificada, você pode usar a
merge
função daheapq
biblioteca.fonte
Se você não pode usar o operador mais (
+
), pode usar aoperator
importação:Como alternativa, você também pode usar a função
__add__
dunder :fonte
+
estiver fora da mesa, useoperator.add
.Como uma maneira mais geral de obter mais listas, você pode colocá-las em uma lista e usar a função
itertools.chain.from_iterable()
1 que, com base nesta resposta, é a melhor maneira de nivelar uma lista aninhada:1. Observe que
chain.from_iterable()
está disponível no Python 2.6 e posterior. Em outras versões, usechain(*l)
.fonte
Se você precisar mesclar duas listas ordenadas com regras de classificação complicadas, talvez seja necessário rolar como no código a seguir (usando uma regra de classificação simples para facilitar a leitura :-)).
fonte
heapq.merge
.Você pode usar o
append()
método definido noslist
objetos:fonte
O código acima, não preserva a ordem, remove duplicados de cada lista (mas não da lista concatenada)
fonte
Como já foi indicado por muitos,
itertools.chain()
é o caminho a percorrer se for necessário aplicar exatamente o mesmo tratamento às duas listas. No meu caso, eu tinha um rótulo e uma bandeira que eram diferentes de uma lista para outra, então eu precisava de algo um pouco mais complexo. Como se vê, nos bastidoresitertools.chain()
simplesmente faz o seguinte:(consulte https://docs.python.org/2/library/itertools.html ), então me inspirei aqui e escrevi algo nesse sentido:
Os principais pontos a serem entendidos aqui são que as listas são apenas um caso especial de iterável, que são objetos como qualquer outro; e que os
for ... in
loops em python podem funcionar com variáveis de tupla, portanto, é simples fazer loop em várias variáveis ao mesmo tempo.fonte
Use uma compreensão simples da lista:
Ele tem todas as vantagens da abordagem mais recente do uso de Generalizações de Descompactação Adicionais - ou seja, você pode concatenar um número arbitrário de iteráveis diferentes (por exemplo, listas, tuplas, intervalos e geradores) dessa maneira - e não se limita ao Python 3.5 ou posterior .
fonte
Uma maneira realmente concisa de combinar uma lista de listas é
o que nos dá
fonte
list.__add__
, use emoperator.add
vez disso. Este é o equivalente mais prolixo dosum(list_of_lists, [])
que é tão ruim. NÃO USE!obj.__class__
eobj.__dict__
.No Python, você pode concatenar duas matrizes de dimensões compatíveis com este comando
fonte
Portanto, existem duas maneiras fáceis.
+
: Cria uma nova lista a partir das listas fornecidasExemplo:
Exemplo:
Assim, vemos que, dentre os dois métodos mais populares,
extend
é eficiente.fonte
chain.from_iterable
).Existem várias maneiras de concatenar listas em python.
fonte
Resultado:
fonte
Se você queria uma nova lista, mantendo as duas listas antigas:
fonte
fonte
Você pode seguir o código
fonte