Como posso obter o produto cartesiano (todas as combinações possíveis de valores) de um grupo de listas?
Entrada:
somelists = [
[1, 2, 3],
['a', 'b'],
[4, 5]
]
Saída desejada:
[(1, 'a', 4), (1, 'a', 5), (1, 'b', 4), (1, 'b', 5), (2, 'a', 4), (2, 'a', 5) ...]
python
list
cartesian-product
ʞɔıu
fonte
fonte
set(cartesian product)
set(inputlist)
sobre todas as suas listas de entrada. Não no resultado.Respostas:
itertools.product
Disponível no Python 2.6.
Qual é o mesmo que,
fonte
product()
geranitems_in_a_list ** nlists
elementos no resultado (reduce(mul, map(len, somelists))
). Não há razão para acreditar que produzir um único elemento não sejaO(nlists)
(amortizado), ou seja, a complexidade do tempo é a mesma que para loops aninhados simplesfor
, por exemplo, para a entrada na pergunta :,nlists=3
número total de elementos no resultado:3*2*2
e cada elemento possuinlists
itens (3
neste caso).*
antes de listas de som? O que isso faz?fonte
Para Python 2.5 e mais antigo:
Aqui está uma versão recursiva de
product()
(apenas uma ilustração):Exemplo:
fonte
args
forem iteradores.com itertools.product :
fonte
*
antes de listas de som?Eu usaria a compreensão da lista:
fonte
Aqui está um gerador recursivo, que não armazena nenhuma lista temporária
Resultado:
fonte
def f(): while True: yield 1
continuará aumentando seu tamanho de pilha à medida que o passarmos?No Python 2.6 e acima, você pode usar 'itertools.product`. Nas versões mais antigas do Python, você pode usar o seguinte código equivalente (quase - consulte a documentação) da documentação , pelo menos como ponto de partida:
O resultado de ambos é um iterador; portanto, se você realmente precisar de uma lista para processamento posterior, use
list(result)
.fonte
Embora já existam muitas respostas, gostaria de compartilhar alguns dos meus pensamentos:
Abordagem iterativa
Abordagem Recursiva
Abordagem Lambda
fonte
Abordagem Recursiva:
Abordagem Iterativa:
fonte
Uma pequena modificação na solução do gerador recursivo acima, com sabor variado:
E, é claro, um invólucro que faz com que funcione exatamente da mesma forma que essa solução:
com um trade-off : verifica se a recursão deve quebrar em cada loop externo e um ganho : nenhum rendimento em chamada vazia, por exemplo
product(())
, o que eu suponho que seria semanticamente mais correto (consulte o doctest).Quanto à compreensão da lista: a definição matemática se aplica a um número arbitrário de argumentos, enquanto a compreensão da lista pode lidar apenas com um número conhecido deles.
fonte
Apenas para adicionar um pouco ao que já foi dito: se você usa o sympy, pode usar símbolos em vez de strings, o que os torna matematicamente úteis.
Sobre o sympy .
fonte
Eu acredito que isso funciona:
fonte
Abordagem Stonehenge:
resultado:
fonte