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)
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)
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)
答案都很好,但有一点建议:
元组是不可变的,这意味着它们不能被改变.因此,如果您需要操作数据,最好将数据存储在列表中,这样可以减少不必要的开销.
在你的情况下,将数据提取到列表中,如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)
| 归档时间: |
|
| 查看次数: |
497320 次 |
| 最近记录: |