将元组转换为列表并返回

我目前正在使用平铺地图在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当然工作。 如果你需要更多的价值,你必须结合几个比特,这会使问题变得更加复杂。