将元组转换为列表并返回
我目前正在使用平铺地图在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))
其中“1”是一堵墙,“0”是空的一个街区。
下面的代码基本上是处理块types变化的代码:
clicked = pygame.mouse.get_pressed() if clicked[0] == 1: currLevel[((mousey+cameraY)/60)][((mousex+cameraX)/60)] = 1
但是由于关卡存储在一个元组中,所以我无法改变不同块的值。 我怎样才能轻松地改变关卡中不同的价值?
编辑:解决! 感谢你们
将元组转换为列表:
>>> t = ('my', 'name', 'is', 'mr', 'tuple') >>> t ('my', 'name', 'is', 'mr', 'tuple') >>> list(t) ['my', 'name', 'is', 'mr', 'tuple']
将列表转换为元组:
>>> l = ['my', 'name', 'is', 'mr', 'list'] >>> l ['my', 'name', 'is', 'mr', 'list'] >>> tuple(l) ('my', 'name', 'is', 'mr', 'list')
你有一个元组元组。
将每个元组转换成一个列表:
[list(i) for i in level] # list of lists
– – 要么 – –
map(list, level)
在完成编辑之后,将其转换回来:
tuple(tuple(i) for i in edited) # tuple of tuples
—或—(谢谢@jamylak)
tuple(itertools.imap(tuple, edited))
你也可以使用一个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]])
操作:
if clicked[0] == 1: x = (mousey + cameraY) // 60 # For readability y = (mousex + cameraX) // 60 # For readability a[x][y] = 1
你可以有一个列表的列表。 将元组元组转换为列表列表,使用:
level1 = [list(row) for row in level1]
要么
level1 = map(list, level1)
并相应地修改它们。
但是一个numpyarrays更酷。
将元组转换为列表
(逗号在给定问题中的元组之间缺失,它被添加以防止错误消息)
方法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)
方法2:
level1 = map(list,level1) print(list(level1))
方法1取— 0.0019991397857666016秒—
方法二取— — 0.0010001659393310547秒—
你为什么不尝试把它的types从一个元组转换成一个列表,反之亦然。
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)
这两个答案都很好,但有一点build议:
元组是不可改变的,这意味着它们不能被改变。 所以,如果你需要操纵数据,最好将数据存储在列表中,这将减less不必要的开销。
在你的情况下提取数据到一个列表,如eumiro所示,修改后创build一个类似结构的小学生给出的答案类似的元组。
也如同build议使用numpy数组是一个更好的select
如果您仅使用一个列表而不是列表列表,则可以显着提高您的速度。 这当然是可能的,只有当你所有的内部列表都是相同的大小(在你的例子中是这样,所以我只是假设这个)。
WIDTH = 6 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[x + y*WIDTH] # print value at (x,y)
如果使用位域而不是列表,则可能会更快:
WIDTH = 8 # better align your width to bytes, eases things later level1 = 0xFC84848484FC # bit field representation of the level print "1" if level1 & mask(x, y) else "0" # print bit at (x, y) level1 |= mask(x, y) # set bit at (x, y) level1 &= ~mask(x, y) # clear bit at (x, y)
同
def mask(x, y): return 1 << (WIDTH-x + y*WIDTH)
但是,只有当你的领域只包含0或1当然工作。 如果你需要更多的价值,你必须结合几个比特,这会使问题变得更加复杂。