将元组转换为列表并返回

use*_*308 171 python tuples list

我目前正在使用平铺地图为pygame中的游戏制作地图编辑器.该级别由以下结构中的块构建(尽管更大):

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))
Run Code Online (Sandbox Code Playgroud)

其中"1"是一个墙,而"0"是一个空的空间.

以下代码基本上是处理块类型更改的代码:

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

但由于级别存储在元组中,我无法更改不同块的值.如何以简单的方式更改关卡中的不同值?

Kho*_*nix 253

将元组转换为列表:

>>> t = ('my', 'name', 'is', 'mr', 'tuple')
>>> t
('my', 'name', 'is', 'mr', 'tuple')
>>> list(t)
['my', 'name', 'is', 'mr', 'tuple']
Run Code Online (Sandbox Code Playgroud)

将列表转换为元组:

>>> l = ['my', 'name', 'is', 'mr', 'list']
>>> l
['my', 'name', 'is', 'mr', 'list']
>>> tuple(l)
('my', 'name', 'is', 'mr', 'list')
Run Code Online (Sandbox Code Playgroud)

  • 这不适合我.如果我通过将t传递给list()来运行第一个块中的代码将元组t转换为列表,我会收到一条错误消息:"***参数中的错误:'(t)'"这似乎发生在我只在调试时.仍然困惑. (5认同)
  • @Jimmy这是因为list是调试器命令,请运行`p list(...)`。 (3认同)

pra*_*nsg 71

你有一个元组元组.
要将每个元组转换为列表:

[list(i) for i in level] # list of lists
Run Code Online (Sandbox Code Playgroud)

- - 要么 - -

map(list, level)
Run Code Online (Sandbox Code Playgroud)

完成编辑后,只需将其转换回来:

tuple(tuple(i) for i in edited) # tuple of tuples
Run Code Online (Sandbox Code Playgroud)

---或---(谢谢@jamylak)

tuple(itertools.imap(tuple, edited))
Run Code Online (Sandbox Code Playgroud)

您还可以使用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]])
Run Code Online (Sandbox Code Playgroud)

用于操纵:

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

  • NumPy是使用Python进行科学计算的基本软件包。NumPy的主要对象是齐次多维数组。它是由相同整数组成的元素表(通常为数字),由正整数元组索引。 (2认同)

eum*_*iro 22

您可以拥有一个列表列表.使用以下命令将元组元组转换为列表列表:

level1 = [list(row) for row in level1]
Run Code Online (Sandbox Code Playgroud)

要么

level1 = map(list, level1)
Run Code Online (Sandbox Code Playgroud)

并相应地修改它们.

但是一个numpy阵列更酷.


Ara*_*mar 17

将元组转换为列表

(给定问题中的元组之间缺少逗号,为防止错误消息而添加了它)

方法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)
Run Code Online (Sandbox Code Playgroud)

方法2:

level1 = map(list,level1)

print(list(level1))
Run Code Online (Sandbox Code Playgroud)

方法1采取--- 0.0019991397857666016秒---

方法2采取--- 0.0010001659393310547秒---


小智 14

为什么不尝试将其类型从元组转换为列表,反之亦然.

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

print(level1)

level1 = list(level1)

print(level1)

level1 = tuple(level1)

print(level1)
Run Code Online (Sandbox Code Playgroud)


AXO*_*AXO 14

从 Python 3.5 ( PEP 448 -- Additional Unpacking Generalizations ) 开始,可以使用以下文字语法将元组转换为列表:

>>> t = (1,2,3)
>>> lst = [*t]
>>> lst
[1, 2, 3]
>>> *lst,  # back to tuple
(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

一个列表理解可以使用元组的元组转换成列表的列表:

>>> 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
Run Code Online (Sandbox Code Playgroud)


tan*_*zil 5

答案都很好,但有一点建议:

元组是不可变的,这意味着它们不能被改变.因此,如果您需要操作数据,最好将数据存储在列表中,这样可以减少不必要的开销.

在你的情况下,将数据提取到列表中,如eumiro所示,并在修改后创建一个类似于由Schoolboy给出的答案的类似结构的元组.

另外正如建议使用numpy数组是一个更好的选择


小智 5

列表到元组并返回可以如下完成

import ast, sys
input_str = sys.stdin.read()
input_tuple = ast.literal_eval(input_str)

l = list(input_tuple)
l.append('Python')
#print(l)
tuple_2 = tuple(l)

# Make sure to name the final tuple 'tuple_2'
print(tuple_2)
Run Code Online (Sandbox Code Playgroud)