multiplicar listas e guardar resultados em variavel

2,902 views
Skip to first unread message

Bruno Becker

unread,
Jul 25, 2015, 12:58:37 PM7/25/15
to Python Brasil
E ai galera! Estou com duvidas de como multiplicar uma lista por outra,multiplicando todos numeros por todos numeros de cada lista,e guardar os resultados em uma unica variavel,por exemplo:

Lista=[1,2,3,4,5,6,7,8]

Lista2=[1,2,3,4,5,6,7,8]

total = lista*lista2

Sendo que a var total tem que guardar a multiplicaçao de todos por todos numeros de cada lista.

Alguem poderia me dizer como fazer isto?


Obrigado.

Willian Morais

unread,
Jul 25, 2015, 1:33:22 PM7/25/15
to python...@googlegroups.com
Bruno,

Da para você utilizar o zip. Exemplo da documentação:

>>> x = [1,2,3]
>>> y = [4,5,6]
>>> zipped = zip(x,y)
>>> zipped
[(1, 4), (2, 5), (3, 6)]


Então fazendo um loop:
>>> for listaA, listaB in zipped:
...     listaA*listaB
...
4
10
18


Ou como uma lista comprehension:
>>> listaTotal = [x*y for x,y in zipped]
[4, 10, 18]

--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar

<*> Para visitar o site do grupo na web, acesse:
    http://groups.google.com/group/python-brasil

<*> Para sair deste grupo, envie um e-mail para:
    python-brasi...@googlegroups.com

---
Você está recebendo esta mensagem porque se inscreveu no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/d/optout.



--
Atenciosamente,

Willian de Morais
São José - Santa Catarina
Celular: (48) 8811-9660

Nicolas Coelho

unread,
Jul 25, 2015, 2:03:12 PM7/25/15
to python...@googlegroups.com
Só por curiosidade, seria possível utilizar o método __mul__ para isso?
Como ficaria o código?

Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.

Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Nicolas Zachow Coelho

"Do what you think is interesting, do something that you think is fun and worthwhile, because otherwise you won't do it well anyway." - Brian Kernighan

Linux - Junior Polegato

unread,
Jul 25, 2015, 2:47:02 PM7/25/15
to Python Brasil

Olá!

Algumas formas:

list(map(lambda i: i[0] * i[1], zip(x, y)))

[a * b for a, b in zip(x, y)]

[x[i] * y[i] for i in range(max(len(x), len(y)))]

Sobre o __mul__ em uma lista seria o mesmo que fazer ela multiplicada por um inteiro, que resulta em outra lista com elementos repetidos, não aceita outra lista como argumento.

Alternativamente, você pode criar uma classe e sobrescrever o __mul__ de uma lista ou usar numpy.

[]'s

Junior Polegato

Bruno Becker

unread,
Jul 25, 2015, 3:48:56 PM7/25/15
to Python Brasil, bbecke...@gmail.com
Agradeço a resposta de todos,a questão é que preciso de multiplicar todos numeros por todos entre si,e guardar numa variavel,no exemplo do Willian,os numeros se multiplicam linearmente,como abaixo:

>>> x = [1,2,3]
>>> y = [4,5,6]
>>> zipped = zip(x,y)
>>> zipped
[(1, 4), (2, 5), (3, 6)]

Em relação a este exemplo,gostaria de multiplicar todos por todos,ou seja,faltou o 4*2,4*3,4*5,4*6,5*4,5*6,e assim por diante...


Nicolas Coelho

unread,
Jul 25, 2015, 4:04:30 PM7/25/15
to python...@googlegroups.com
Com dois 'for' é fácil de fazer, mas deve ter alguma maneira mais esperta de fazer isso.


--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com

---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.

Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Juan Lopes

unread,
Jul 25, 2015, 4:20:29 PM7/25/15
to python...@googlegroups.com
[[x*y for x in Lista] for y in Lista2]

Bruno Becker

unread,
Jul 25, 2015, 6:28:38 PM7/25/15
to Python Brasil, bbecke...@gmail.com
Consegui fazer o que queria,mas não totalmente por não saber programar direito,mas obrigado mesmo assim,a questão é que estou querendo testar um crivo pra numeros primos que precisa disto,então vou postar a teoria do crivo num tópico antigo que abri a um tempo atrás,pra ver se alguem transforma em programa este crivo,pra efeito de teste.

Estará no topico "teorema becker".

Obrigado.

Em sábado, 25 de julho de 2015 13:58:37 UTC-3, Bruno Becker escreveu:

Bruno Becker

unread,
Sep 1, 2015, 4:01:01 PM9/1/15
to Python Brasil
Boa tarde!!!

Usei a dica do Juan Lopes, e deu certo,multiplicou todos por todos da lista.

Mas no projeto que estou mexendo,que impor um limite nesta multiplicação,pra efeito de poupar recursos e utilidade.

tipo assim:

total=[[x*y for x in lista1] for y in lista1]

Então,eu quero que esta multiplicação pare no meio do caminho de acordo com um limite que irei impor,do tipo, " multiplique até que total == lista1[-1],e pronto.
Ja tente de tudo, while, if e tudo mais,mas não consegui.

Alguem teria alguma idéia de como fazer isso?



Em sábado, 25 de julho de 2015 13:58:37 UTC-3, Bruno Becker escreveu:

Diego Rocha

unread,
Sep 1, 2015, 4:11:38 PM9/1/15
to Python Brasil
Becker,

Você quer multiplicar par a par das listas e parar quando o somatório total das listas atingir um valor, é isso?

Exemplo

a = [1, 2, 3]
b = [2, 4, 6]
max = 10
total = 1 * 2 + 2 * 4 + 3 * 6

Esse total seria atingido com os dois primeiros itens e a última parte (3 * 6) não seria realizada, é isso?

Atenciosamente,
Diego Rocha

Diego Rocha

unread,
Sep 1, 2015, 4:33:09 PM9/1/15
to Python Brasil
Se a sua intenção é essa que eu entendi, esses trechos de código devem resolver: https://gist.github.com/diegorocha/b9e13ef1006aa95ab50a

Explico abaixo:

A função zip junta duas listas casando o primeiro elemento de uma com o primeiro da outra, depois o segundo elemento de uma com o segundo da outra, assim sucessivamente (como um zipper).

O resultado dela é uma lista cujos itens são tuplas com os elementos, por exemplo
>>>a = [1, 2, 3]
>>>b = [2, 4, 6]
>>>c = zip(a, b)
>>>c
[(1, 2), (2, 4), (3, 6)]
Dessa forma, se você percorrer a lista c, você terá cada par da sua multiplicação.
Assim, você faz uma repetição que pega cada item de c, multiplica eles e armazena num total.
E depois você verifica se o valor máximo foi atingido, quebrando a repetição

Atenciosamente,
Diego Rocha

Bruno Becker

unread,
Sep 1, 2015, 7:34:56 PM9/1/15
to Python Brasil
È bem isso mesmo que preciso,vou testar aqui e ver se funciona,ai eu digo aqui depois.

Valeu mesmo pela atenção,eis o motivo da fama dos foruns sobre Python serem os mais prestativos.

Bruno Becker

unread,
Sep 2, 2015, 7:44:03 PM9/2/15
to Python Brasil
Então Diego,não deu certo,rsrs pois não quero que se some tudo,quero apenas limitar a multiplicação até chegar em determinado valor,por exemplo:

lista1= [1,2,3,4,5,6,7,8,9]

total =[[x*y for x in lista1] for y in lista1]

print(total)

-------------------------------------------------------

Basicamente é isso ai em cima que o algoritmo irá fazer, mas eu quero por exemplo,quando total for igual a 25 que o loop pare,sem continuar multiplicando e gastando memória atoa,claro que os valores não são esses,ai acima é apenas um exemplo simplificado,e esse código vai trabalhar em ciclos,loops definidos anteriormente.

Mas como o código acima ta valendo pra mim,gostaria de uma solução usando ele mesmo,se possivel... ou seja,como parar este loop,num valor predefinido:

total =[[x*y for x in lista1] for y in lista1]

valeu!




Em terça-feira, 1 de setembro de 2015 17:33:09 UTC-3, Diego Rocha escreveu:

Linux - Junior Polegato

unread,
Sep 3, 2015, 4:15:17 AM9/3/15
to Python Brasil

Olá!

Se "total" você se refere a x*y, dá pra colocar um "if x*y < 25", contudo o processamento no é interrompido, vai processar todos os elementos das duas duas listas e fazer duas vezes x*y, então se a lista1 for ordenada, melhor fazer assim, por exemplo:

total = []
limite = 25
for y in lista1:
    vetor = []
    for x in lista1:
        valor = x * y
        if valor > limite: break
        vetor.append(valor)
    if not vetor: break
    total.append(vetor)

--
[]'s

Junior Polegato

Bruno Becker

unread,
Sep 3, 2015, 12:26:16 PM9/3/15
to Python Brasil
Então,tentei fazer um teste com seu código,mas ele não esta parando a multiplicação,tipo,no exemplo abaixo deveria parar quando o valor atingisse 101,mas ele continua,que eu fiz de errado?

lista1=[5,11,13,17,19,23,101]

total = []
limite = [lista1[-1]]
for y in lista1:
    vetor = []
    for x in lista1:
        valor = x * y
        if valor > limite: break
        vetor.append(valor)
    if not vetor: break
    total.append(vetor)
    
    print(vetor)

Welton Vaz

unread,
Sep 3, 2015, 3:23:03 PM9/3/15
to python...@googlegroups.com
Vc poderia postar este codigo no pastebin.com ou git, esta dando vários erros



Enviado com MailTrack

Welton Vaz de Souza
TWITTER: http://twitter.com/Weltonvaz
BLOG: http://ghandybh.blogspot.com/
FACEBOOK: https://www.facebook.com/weltonv
Cel: (31)9327-0823
***********************************************************

 °v° NÃO USE DROGAS,
/(_)\ USE GNU/LINUX
 ^ ^

Linux - Junior Polegato

unread,
Sep 3, 2015, 4:01:35 PM9/3/15
to python...@googlegroups.com
On 03-09-2015 13:26, Bruno Becker wrote:
> Então,tentei fazer um teste com seu código,mas ele não esta parando a
> multiplicação,tipo,no exemplo abaixo deveria parar quando o valor
> atingisse 101,mas ele continua,que eu fiz de errado?
>
> lista1=[5,11,13,17,19,23,101]
>
> total = []
> limite = [lista1[-1]]
> [...]

Olá!

Faça "limite = lista[1]", pois limite é um valor e não uma
lista com um valor, compreende?


--

[]'s

Junior Polegato

Bruno Becker

unread,
Sep 3, 2015, 7:29:42 PM9/3/15
to Python Brasil
Deu certo!!! Vc não imagina o quanto quebrei a cabeça com isso,rsrsrs Agora "compreendi",kkk

Bom,valeu a ajuda de todos,tópico plenamente resolvido.

Valeu!!!

Linux - Junior Polegato

unread,
Sep 4, 2015, 12:50:58 AM9/4/15
to Python Brasil

Olá!

Se "total" você se refere a x*y,

--
[]'s

Junior Polegato

Reply all
Reply to author
Forward
0 new messages