Sorteando um elemento de uma lista

6,288 views
Skip to first unread message

Bruno Kuhn

unread,
Jul 6, 2012, 5:02:37 PM7/6/12
to python...@googlegroups.com
Olá!
Minha dúvida é sobre listas.
Minha lista contém uns 50 elementos. O que eu quero é sortear UM elemento desta lista.
Como eu faço isso?

Ex:
Lista = [1,2,3,4,5,6,7,8,9,0]

Willie

unread,
Jul 6, 2012, 5:05:46 PM7/6/12
to python...@googlegroups.com
Você pode usar o random:

import random
Lista = [1,2,3,4,5,6,7,8,9,0]
index = random.randint(0, len(Lista) - 1)
elemento = Lista[index]

É só uma sugestão...

Douglas Camata

unread,
Jul 6, 2012, 5:05:51 PM7/6/12
to python...@googlegroups.com
from random import choice

lista = [1,2,3,4,5,6,7,8,9]
print choice(lista)

2012/7/6 Bruno Kuhn <bruno....@gmail.com>

--
------------------------------------
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



--
Douglas Camata
Graduando em Ciência da Computação (UENF)

Skype: douglas_camata
-----------------------------------
Linux User #509211

Denis Costa

unread,
Jul 6, 2012, 5:05:46 PM7/6/12
to python...@googlegroups.com


Em 6 de julho de 2012 18:02, Bruno Kuhn <bruno....@gmail.com> escreveu:
[1,2,3,4,5,6,7,8,9,0]

In [1]: import random

In [2]: l = [1,2,3,4,5,6,7,8,9,0]

In [3]: random.choice(l)
Out[3]: 9


--
Denis Costa

“First, solve the problem. Then, write the code.” - John Johnson

Danillo Souza

unread,
Jul 6, 2012, 5:06:11 PM7/6/12
to python...@googlegroups.com
from random import choice
lista = [1,2,3,4,5,6,7,8,9,0]
print choice(lista)

--
Danillo Souza
Teck Software / Editora Brasil Energia



Em 6 de julho de 2012 18:02, Bruno Kuhn <bruno....@gmail.com> escreveu:

--

Luciano Ramalho

unread,
Jul 6, 2012, 5:21:40 PM7/6/12
to python...@googlegroups.com
On Fri, Jul 6, 2012 at 6:05 PM, Willie <williel...@gmail.com> wrote:
> import random
> Lista = [1,2,3,4,5,6,7,8,9,0]
> index = random.randint(0, len(Lista) - 1)
> elemento = Lista[index]

99,7% das vezes quando a expressão "len(Lista) - 1" aparece em código
Python, tem um jeito melhor de fazer. Porque quase sempre trata-se de
manipulação direta de índices, coisa que raramente é necessária em
Python.

Neste caso, como já disserem a resposta certa é a função random.choice:

http://docs.python.org/library/random.html#random.choice

Vale notar que logo abaixo dela na documentação aparece a função
random.shuffle, que embaralha elementos de listas (ou de qualquer
sequência mutável).

[ ]s
Luciano



--
Luciano Ramalho
NOVO TWITTER: @ramalhoorg

Autor e instrutor dos cursos:
* Academia Python na Globalcode
--> http://python.globalcode.com.br

* Python para quem sabe Python nas Oficinas Turing
--> http://turing.com.br/ppqsp

Willie

unread,
Jul 6, 2012, 5:34:35 PM7/6/12
to python...@googlegroups.com
Vivendo e aprendendo.

Bruno Kuhn

unread,
Jul 6, 2012, 5:37:02 PM7/6/12
to python...@googlegroups.com
Obrigado à todos vocês! :)

Marco André Lopes Mendes

unread,
Jul 6, 2012, 6:04:53 PM7/6/12
to python...@googlegroups.com
Se você quer retirar o elemento do conjunto quando ele for sorteado, use shuffle() e dois pop(). Se quer que ele continue fazendo parte do conjunto e possa ser sorteado novamente, utilize choice().

Um abraço

Marco André

Bruno Kuhn

unread,
Jul 6, 2012, 6:14:42 PM7/6/12
to python...@googlegroups.com
Você pode me dar um exemplo?

Luciano Ramalho

unread,
Jul 6, 2012, 6:21:59 PM7/6/12
to python...@googlegroups.com
> Em sexta-feira, 6 de julho de 2012 19h04min53s UTC-3, Marco André Lopes
> Mendes escreveu:
>>
>> Se você quer retirar o elemento do conjunto quando ele for sorteado, use
>> shuffle() e dois pop(). Se quer que ele continue fazendo parte do conjunto e
>> possa ser sorteado novamente, utilize choice().

2012/7/6 Bruno Kuhn <bruno....@gmail.com>:
> Você pode me dar um exemplo?

Bruno, a explicação do Marco foi super clara, ele deu a receita até
com os nomes das funções para vc usar.

Não se aprende a programar pedindo código pronto em uma lista.

Você aprende codando. E se tiver dúvidas, mande-as para a lista. De
preferência com código (em um pastebin se for mais que meia dúzia de
linhas).

[ ]s
Luciano

--

Marco André Lopes Mendes

unread,
Jul 6, 2012, 6:38:03 PM7/6/12
to python...@googlegroups.com
Bruno, a explicação do Marco foi super clara, ele deu a receita até
com os nomes das funções para vc usar.

Não se aprende a programar pedindo código pronto em uma lista.

E se você quer aprender rápido e depender menos das pessoas, invista um tempo aprendendo a usar o modo interativo do Python. Pode ser o padrão, ou ipython, ou ainda o DreamPie. Você experimenta a linguagem e nunca mais esquece. 

Além disso se você digitar algo assim no Google: "pick a number + python" deve achar muitas respostas. Até mesmo em português você deve encontrar bons exemplos.

Um abraço

Marco André

Leonardo Santagada

unread,
Jul 6, 2012, 6:43:29 PM7/6/12
to python...@googlegroups.com
Eu sei que a pergunta é de iniciante e a resposta aqui vai ser meio
tecnica ma vamo lá, shuffle tem o problema grave de não conseguir
gerar todas as possiveis randomizações de ordem. Eu acho (e alguém que
entenda mais dessa area por favor confirmar) que tu consegue mais
entropia fazendo um randint e removendo o elemento da lista a cada
sorteio do que um suffle e vários pop.

http://docs.python.org/library/random.html#random.shuffle

--

Leonardo Santagada

Bruno Kuhn

unread,
Jul 6, 2012, 6:47:35 PM7/6/12
to python...@googlegroups.com
Para o que eu estou precisando, o número não deve ser excluído da lista.
E eu já consegui fazer o que eu precisava.
Agradeço a todos que me ajudaram! :)

Alysson Bruno

unread,
Jul 7, 2012, 7:23:29 AM7/7/12
to python...@googlegroups.com
Eu não entendi porque tem q ser 2 pop?

Não basta 1:
>>> from random import shuffle
>>> lista = [0,1,2,3,4,5,6,7,8,9]
>>> shuffle(lista)
>>> lista.pop()
2
>>> 
paz e amor (love and peace),

Alysson Bruno
===============================================
Palmas(TO)
Brasil

Blog: http://abruno.com


=================================================================
Meu alterego Escritor:

Leia alguns contos que escrevo, não esqueça de me dar sua opinião: http://goo.gl/Wjn4p

=================================================================

Adorilson Bezerra de Araujo

unread,
Jul 7, 2012, 6:45:08 PM7/7/12
to python...@googlegroups.com


2012/7/7 Alysson Bruno <alysso...@gmail.com>

Eu não entendi porque tem q ser 2 pop?

1) Como é que nós vamos saber que você não entendeu? :p
2) Por que você está dizendo isso? Ainda mais que logo abaixo você *afirma* que não basta 1. ;)

Ok, Bruno, obviamente que estou fazendo uma leitura mais ao pé da letra e que pelo contexto dá pra entender o que você disse.

No entanto, em relação ao item 1, você além de não ter feito o bottom-post[0], ainda apagou a mensagem original,
perdendo qualquer referência.
Então pra saber do que você tava falando tive(mos) de sair catando nas mensagens onde tinha sido falado em usar dois pops.
Daí a importância e praticarmos o bottom-post.

Btw, foi o Marco André que disse que seriam necessários dois pops. E eu também fiquei na dúvida agora.


[0] http://catb.org/jargon/html/B/bottom-post.html
 

--
------------------------------------
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



--
Adorilson Bezerra

Atenção: Este e-mail pode conter anexos no formato ODF (Open Document Format)/ABNT (extensões odt, ods, odp, odb, odg). Antes de pedir os anexos em outro formato, você pode instalar gratuita e livremente o BrOffice (http://www.broffice.org) ou o seguinte Plugin para Microsoft Office (http://www.sun.com/software/star/odf_plugin/get.jsp).

Henr"Ikke" Pereira

unread,
Jul 7, 2012, 6:46:55 PM7/7/12
to python...@googlegroups.com
Acho que em vez de dois, ele quis dizer depois

2012/7/7 Adorilson Bezerra de Araujo <ador...@gmail.com>



--
Henr"Ikke" G.G. Pereira
+55 (55) 9619-7499
|_|0|_|
|_|_|0|
|0|0|0|

Marco André Lopes Mendes

unread,
Jul 7, 2012, 9:24:50 PM7/7/12
to python...@googlegroups.com

Isso mesmo. O problema foi o touchpad.

Marco André

Mário Neto

unread,
Jul 8, 2012, 9:35:54 PM7/8/12
to python...@googlegroups.com
def sorteia(lista):
    continua = 'sim'
    while len(lista) > 0 and continua == 'sim':
        shuffle(lista)
        print lista.pop()
        continua = raw_input('coninua: sim ou nao: ')
    print 'acabou'

cara algo assim (super estruturado) (o.O) acho q da certo, mas tu tem q melhorar mt meu código rápido e adequar ao que vc qr! aliás, ver aí se ao menos ta funcionando! hehe =) vlw!
Att. Mário Araújo Chaves Neto
Programmer, Designer and U.I. Engineer

MBA in Design Digital - 2008 - FIC
Analysis and Systems Development - 2011 - Estácio
Design and Implementation of Internet Environments - 2003 - FIC

Luciano Ramalho

unread,
Jul 9, 2012, 1:12:25 AM7/9/12
to python...@googlegroups.com
2012/7/8 Mário Neto <macnd...@gmail.com>:
> def sorteia(lista):
> continua = 'sim'
> while len(lista) > 0 and continua == 'sim':
> shuffle(lista)
> print lista.pop()
> continua = raw_input('coninua: sim ou nao: ')
> print 'acabou'

Isso é *muito* ineficiente. Basta fazer shuffle uma vez e dentro do
laço fazer apenas pop, porque a lista já está embaralhada, não tem
porque fazer shuffle a cada iteração.

[ ]s
Luciano

Mário Neto

unread,
Jul 9, 2012, 8:24:03 AM7/9/12
to python...@googlegroups.com
Olha aí uma ótima melhoria pra tu colocar no simple-raffle hehe...
Bem lembrado Luciano, valeu! =)

Leonardo Santagada

unread,
Jul 9, 2012, 9:25:48 AM7/9/12
to python...@googlegroups.com
2012/7/9 Luciano Ramalho <luc...@ramalho.org>:
> 2012/7/8 Mário Neto <macnd...@gmail.com>:
>> def sorteia(lista):
>> continua = 'sim'
>> while len(lista) > 0 and continua == 'sim':
>> shuffle(lista)
>> print lista.pop()
>> continua = raw_input('coninua: sim ou nao: ')
>> print 'acabou'
>
> Isso é *muito* ineficiente. Basta fazer shuffle uma vez e dentro do
> laço fazer apenas pop, porque a lista já está embaralhada, não tem
> porque fazer shuffle a cada iteração.

Lembrando o q eu disse antes, o shuffle não consegue gerar todas as
possíveis ordenações de elementos, essa talvez não seja a melhor
solução também.

--

Leonardo Santagada

Christian S. Perone

unread,
Jul 9, 2012, 9:30:38 AM7/9/12
to python...@googlegroups.com
Como a lista do Bruno tem só uns 50 elementos ele não vai ter problema, o shuffle só é problema quando o tamanho for maior que >2080 elementos pelo que entendi, que seria quando encerraria o período (2**19937-1) do mersenne twister.

2012/7/9 Leonardo Santagada <sant...@gmail.com>
--
------------------------------------
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



--
"Forgive, O Lord, my little jokes on Thee, and I'll forgive Thy great big joke on me."
http://pyevolve.sourceforge.net/wordpress/

Reply all
Reply to author
Forward
0 new messages