[Lista de Times] Como organizar o confronto de itens em uma lista?

79 views
Skip to first unread message

Thiago Panini

unread,
May 26, 2018, 11:13:14 AM5/26/18
to python...@googlegroups.com
Pessoal, bom dia!

Estou treinamento Orientação à Objeto através de um projetinho relacionado à Copa do Mundo 2018.

Dividi as seleções em grupos e pretendo organizar o confronto entre elas a partir das rodadas.

Considerando que, na fase de grupos, temos 3 rodadas (cada seleção joga 3 partidas) e que cada grupo possui 4 seleções, tenho que organizar de tal forma que os confrontos não se repitam, ou seja, cada seleção joga uma partida com cada elemento do grupo.

No exemplo abaixo, consigo apenas acionar o método partida() considerando um mesmo confronto, ou seja, em todas as 3 rodadas eu estou repetindo o mesmo jogo. Como mudar isso? Vejam abaixo um trecho do código:

grupoA = [arabia, egito, russia, uruguai]  # Cada item da lista é um objeto instanciado através da classe Selecao
copaMundo = [grupoA, grupoB, grupoC, ..., grupoH]  # Os objetos foram separados em listas e agrupados todos em uma lista geral

for rodada in range(3):
....cabecalhoRodada(rodada+1)  # Imprime um cabeçalho no prompt do tipo "RODADA X"
....for grupo in range(1):
........cabecalhoGrupo(nomesGrupos[grupo])  # Imprime um cabeçalho no prompt do tipo "GRUPO X"
........Selecao.partida(Selecao, copaMundo[grupo][0], copaMundo[grupo][1])
........Selecao.partida(Selecao, copaMundo[grupo][2], copaMundo[grupo][3]

Obs: o método partida() solicita dois objetos, ou seja, duas seleções que irão se enfrentar.

Obs2: no código acima, tenho o seguinte resultado nas três rodadas:

Arabia x Egito
Russia x Uruguai

Muito obrigado.

Atenciosamente,
Thiago Panini

Jayme

unread,
May 26, 2018, 11:18:31 AM5/26/18
to python...@googlegroups.com
Testa usar itertools.combinations:

import itertools
itertools.combinations('ABCD', 2)
# AB AC AD BC BD CD

Deve resolver seu problema.
Se quiser mudar a ordem, pode usar por cima um random.shuffle. ;)


--
--
------------------------------------
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-brasil+unsubscribe@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-brasil+unsubscribe@googlegroups.com.
Para postar nesse grupo, envie um e-mail para python...@googlegroups.com.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/python-brasil/CAO3VXxc7YC%3DZe7ztvzZQUx1u1a%3DBvONmpHwKedz%2BSVHAUjpuJg%40mail.gmail.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Thiago Panini

unread,
May 26, 2018, 12:47:07 PM5/26/18
to python...@googlegroups.com
Jayme, muito obrigado pela resposta!

Nesse meio tempo pesquisei sobre o itertools e fiz algumas alterações no código que, a princípio, funcionaram bem.

Veja, certamente não introduzi uma linha de raciocínio otimizada e muito provavelmente este meu código poderia ser escrito de uma forma muito mais "eficiente" e "limpa". Porém gostaria de compartilhar os resultados iniciais com vocês. Inclusive, abro a discussão sobre o que eu poderia fazer diferente pra adotar a tal filosofia "pythonista".

# Relembrando, temos
grupoA = [arabia, egito, russia, uruguai]  # Cada item da lista é um objeto instanciado através da classe Selecao
grupoB = [espanha, ira, marrocos, portugal] # E assim sucessivamente até o Grupo H

# Para se ter uma ideia, se eu "printar" o grupoA neste momento, terei algo do tipo:
print(grupoA) = [local do objeto Arabia, local do objeto Egito, local do objeto Russia, local do objeto Uruguai]

grupoA = list(combinations(grupoA, 2))  # Transforma os objetos do grupo em tuplas de dois elementos (confrontos que não se repetem)
grupoB = list(combinations(grupoB, 2))  # E assim sucessivamente para todos os outros grupos

# Apenas para entenderem melhor, se eu printar o grupoA após a aplicação do combinations(), terei uma lista de 5 elementos formada por tuplas de 2 elementos, do tipo:
# Onde a sequência 'ABCD' é, no caso, a lista grupoX formada por seus respectivos objetos. Imagine que A = arabia, B = egito, C = russia e D = uruguai



copaMundo = [grupoA, grupoB, grupoC, grupoD, grupoE, grupoF, grupoG, grupoH] # Lista contemplando todos os grupos.

ordem = [(1, 0, 5), (2, 1, 4), (3, 2, 3)]  # Lista formada por tuplas que definem: index[0] = rodada; index[1] = confronto 1 da Rodada 1; index[2] = confronto 2 da Rodada 1

for rodada in ordem:
....cabecalhoRodada(rodada[0])
....for grupo in range(1): # range(8) define todas as partidas
........cabecalhoGrupo(nomesGrupos[grupo])
........Selecao.partida(Selecao, copaMundo[grupo] [rodada[1]] [0], copaMundo[grupo] [rodada[1]] [1])
........Selecao.partida(Selecao, copaMundo[grupo] [rodada[2]] [0], copaMundo[grupo] [rodada[2]] [1])

Agora em cada Rodada eu obtenho confrontos que não se repetem!

Muito obrigado mais uma vez! Caso tenham algum comentário, dúvida ou dica sobre o tema, responderei.




Edson Silva

unread,
May 26, 2018, 5:36:56 PM5/26/18
to Python Brasil
     Oi,Pessoal!

     Preciso de uma ajuda.  Vi o exemplo:
     No entando não consigo recuperar a lista [AB AC AD BC BD CD], quando digito:
>>> combinations("ABCD", 2)
<generator object combinations at 0x02392FC0>.
O que volta é só o endereço da memória <generator object combinations at 0x02392FC0>.
   Tentei acessar como uma lista mais não deu certo.

Thiago Panini

unread,
May 26, 2018, 5:52:18 PM5/26/18
to python...@googlegroups.com
Edson, boa noite!

Pra poder trabalhar com os elementos gerados pela função combinations(), é necessário converter o resultado em uma sequência (por exemplo, uma lista).

Tente aplicar: var = list(combinations('ABCD', 2))

O resultado será uma lista formada por tuplas.

Att,
Thiago Panini

--
--
------------------------------------
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-brasil+unsubscribe@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-brasil+unsubscribe@googlegroups.com.
Para postar nesse grupo, envie um e-mail para python...@googlegroups.com.

Edson Silva

unread,
May 26, 2018, 8:12:24 PM5/26/18
to Python Brasil
Boa noite, Thiago!

Obrigado pela ajuda!
Assim como fez quero compartilhar o meu caso, para quem sabe ajudar outro colega.

Mesmo com o var = list(combinations('ABCD', 2)), ainda deu erro:
'''
Traceback (most recent call last):
  File "<pyshell#36>", line 1, in <module>
    var = list(combinations('ABCD', 2))
  File "<pyshell#17>", line 4, in combinations
    for indices in permutations(range(n), r):
NameError: name 'permutations' is not defined mais 
'''
Pois o " import itertools" não estava funcionado corretamente.
No entanto foi resolvido  quando inciei desta forma: "from itertools import combinations"


---
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 postar nesse grupo, envie um e-mail para python...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages