Problema com a funçao reverse()... resultado inesperado

o codigo é esse:

tabela = [[['a', 'b'], ['c', 'd']], [['e', 'f'], ['g', 'h']]]

for r in range(0, 2):
    tabela.append(tabela[r].copy())
    tabela[-1].reverse()
    for j in range(0, 2):
        tabela[-1][j].reverse()

print(tabela)

Por que a saida desse codigo é: [[['b', 'a'], ['d', 'c']], [['f', 'e'], ['h', 'g']], [['d', 'c'], ['b', 'a']], [['h', 'g'], ['f', 'e']]]

ao invez de ser : [[['a', 'b'], ['c', 'd']], [['e', 'f'], ['g', 'h']], [['d', 'c'], ['b', 'a']], [['h', 'g'], ['f', 'e']]]

Boa noite, segue um exemplo:

tabela = [[['a', 'b'], ['c', 'd']], [['e', 'f'], ['g', 'h']]]

for r in range(0, 2):
  #faço a cópia da lista 1 interna: [['a','b'],['c','d']] e ..
  temp = tabela[r].copy()
  temp.reverse() #inverto!
  
  #faço a inversão das listas mais interna:['a','b'] e ...
  for j in range(0,2):
    temp[j].reverse()
  
  #Por fim adiciono na lista tabela!
  tabela.append(temp)

print(tabela)

Obrigado, Jelson1. Me ajuda muito. Mas então o problema está na utilização do append? Quero entender o que estava acontecendo para aprender

1 curtida

Do jeito que você fez eu não conseguir entender, lista dentro de listra, dentro de lista, fico confuso…rsrsrs. mas eu acredito que o problema estava na ordem das operações, você deveria seguir os passos:

  1. Fazer a copia da primeira lista interna;
  2. Fazer a inversão dela;
  3. Inverter as listas dentro dela;
  4. Por último adicionar na lista tabela (append).

entao, na verdade esse é um trecho de um script que to criando… esse trecho eu modifiquei para postar aqui… mas é basicamente isso ai.
a lista representa uma tabela de jogos de um campeonato. as duas sublistas seriam as rodadas de jogos, cada uma com dois jogos (duas rodadas, dois jogos cada rodada)
Essa lista inicial (tabela) representa os jogos de ida. entao, eu preciso criar mais duas rodadas invertendo a ordem dos jogos dentro de cada rodada e invertendo os mandantes e visitantes… as letras representam as equipes.
o problema é que esse print final, deveria ser… os jogos de ida: [['a', 'b'], ['c', 'd']], [['e', 'f'], ['g', 'h']] + os jogos de volta: [[['d', 'c'], ['b', 'a']], [['h', 'g'], ['f', 'e']]]
assim: [[['a', 'b'], ['c', 'd']], [['e', 'f'], ['g', 'h']], [['d', 'c'], ['b', 'a']], [['h', 'g'], ['f', 'e']]]

Jelson1, acabei de testar o seu codigo e a saida foi a mesma que a minha: [[[‘b’, ‘a’], [‘d’, ‘c’]], [[‘f’, ‘e’], [‘h’, ‘g’]], [[‘d’, ‘c’], [‘b’, ‘a’]], [[‘h’, ‘g’], [‘f’, ‘e’]]] essa saida nao é o resultado que eu quero
obrigado!

Bom, eu acho que tive uma ilusão de óptica quando testei esse código. O Problema está na hora de fazer a cópia da lista, como se trata de uma lista dentro de outra, estamos fazendo uma cópia superficial da mesma, desse modo quando alteramos o valor dos itens de uma a outra também muda! Para corrigir isso devemos fazer uma cópia profunda deepcopy. Detalhe devemos fazer o import da biblioteca copy.

import copy

tabela = [[['a', 'b'], ['c', 'd']], [['e', 'f'], ['g', 'h']]]

for r in range(0, 2):
  #faço a cópia da lista 1 interna: [['a','b'],['c','d']] e ..
  temp = copy.deepcopy(tabela[r])
  temp.reverse() #inverto!
  
  #faço a inversão das listas mais interna:['a','b'] e ...
  for j in range(0,2):
    temp[j].reverse()
  
  #Por fim adiciono na lista tabela!
  tabela.append(temp)

print(tabela)

Para saber mais sobre isso dá uma olhada nesse link:
https://www.programiz.com/python-programming/shallow-deep-copy

Acho que agora vai! :slightly_smiling_face:

1 curtida

Aaaah, agora deve dar certo, haha. Depois eu vou testar… vou ver esse link ai também… se tudo ser certo eu nao volto mais haha… obrigado, ajudou muito

1 curtida