282 votes

Convertir un tuple en liste et inversement

Je travaille actuellement sur un éditeur de cartes pour un jeu en pygame, utilisant des cartes de tuiles. Le niveau est construit à partir de blocs dans la structure suivante (bien que beaucoup plus grande) :

level1 = (
         (1,1,1,1,1,1)
         (1,0,0,0,0,1)
         (1,0,0,0,0,1)
         (1,0,0,0,0,1)
         (1,0,0,0,0,1)
         (1,1,1,1,1,1))

où "1" est un bloc qui est un mur et "0" est un bloc qui est de l'air vide.

Le code suivant est essentiellement celui qui gère le changement de type de bloc :

clicked = pygame.mouse.get_pressed()
if clicked[0] == 1:
    currLevel[((mousey+cameraY)/60)][((mousex+cameraX)/60)] = 1

Mais comme le niveau est stocké dans un tuple, je ne peux pas modifier les valeurs des différents blocs. Comment puis-je modifier facilement les différentes valeurs du niveau ?

370voto

Khonix Points 3908

Convertit un tuple en liste :

>>> t = ('my', 'name', 'is', 'mr', 'tuple')
>>> t
('my', 'name', 'is', 'mr', 'tuple')
>>> list(t)
['my', 'name', 'is', 'mr', 'tuple']

Convertit une liste en tuple :

>>> l = ['my', 'name', 'is', 'mr', 'list']
>>> l
['my', 'name', 'is', 'mr', 'list']
>>> tuple(l)
('my', 'name', 'is', 'mr', 'list')

89voto

Schoolboy Points 3489

Vous avez un tuple de tuples.
Pour convertir chaque tuple en liste :

[list(i) for i in level] # list of lists

--- OR ---

map(list, level)

Une fois l'édition terminée, il suffit de les reconvertir :

tuple(tuple(i) for i in edited) # tuple of tuples

--- OR --- (Merci @jamylak)

tuple(itertools.imap(tuple, edited))

Vous pouvez également utiliser un tableau numpy :

>>> a = numpy.array(level1)
>>> a
array([[1, 1, 1, 1, 1, 1],
       [1, 0, 0, 0, 0, 1],
       [1, 0, 0, 0, 0, 1],
       [1, 0, 0, 0, 0, 1],
       [1, 0, 0, 0, 0, 1],
       [1, 1, 1, 1, 1, 1]])

Pour manipuler :

if clicked[0] == 1:
    x = (mousey + cameraY) // 60 # For readability
    y = (mousex + cameraX) // 60 # For readability
    a[x][y] = 1

27voto

eumiro Points 56644

Vous pouvez avoir une liste de listes. Convertissez votre tuple de tuples en une liste de listes en utilisant :

level1 = [list(row) for row in level1]

ou

level1 = map(list, level1)

et les modifier en conséquence.

Mais un tableau numérique est plus froid.

23voto

irdb Points 11

Depuis Python 3.5 ( PEP 448 -- Généralisations supplémentaires du déballage ), on peut utiliser la syntaxe littérale suivante pour convertir un tuple en liste :

>>> t = (1,2,3)
>>> lst = [*t]
>>> lst
[1, 2, 3]
>>> *lst,  # back to tuple
(1, 2, 3)

A compréhension de la liste peut être utilisé pour convertir un tuple de tuples en une liste de listes :

>>> level1 = (
...      (1,1,1,1,1,1),
...      (1,0,0,0,0,1),
...      (1,0,0,0,0,1),
...      (1,0,0,0,0,1),
...      (1,0,0,0,0,1),
...      (1,1,1,1,1,1))
>>> level1_list = [[*row] for row in level1]
>>> level1_list
[[1, 1, 1, 1, 1, 1], 
 [1, 0, 0, 0, 0, 1], 
 [1, 0, 0, 0, 0, 1], 
 [1, 0, 0, 0, 0, 1], 
 [1, 0, 0, 0, 0, 1], 
 [1, 1, 1, 1, 1, 1]]
>>> *((*row,) for row in level1_list),
((1, 1, 1, 1, 1, 1), 
 (1, 0, 0, 0, 0, 1), 
 (1, 0, 0, 0, 0, 1), 
 (1, 0, 0, 0, 0, 1), 
 (1, 0, 0, 0, 0, 1), 
 (1, 1, 1, 1, 1, 1))
>>> _ == level1
True

20voto

Aravind Points 1

Pour convertir des tuples en listes

(Des virgules manquaient entre les tuples dans la question donnée, elles ont été ajoutées pour éviter un message d'erreur)

Méthode 1 :

level1 = (
     (1,1,1,1,1,1),
     (1,0,0,0,0,1),
     (1,0,0,0,0,1),
     (1,0,0,0,0,1),
     (1,0,0,0,0,1),
     (1,1,1,1,1,1))

level1 = [list(row) for row in level1]

print(level1)

Méthode 2 :

level1 = map(list,level1)

print(list(level1))

La méthode 1 a pris --- 0.0019991397857666016 secondes ---

La méthode 2 a pris --- 0.0010001659393310547 secondes ---

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X