将元组转换为列表并返回

时间:2013-04-30 09:35:36

标签: python list tuples

我目前正在使用平铺地图为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”是一个空的空间。

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

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

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

10 个答案:

答案 0 :(得分:220)

将元组转换为列表:

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

答案 1 :(得分:65)

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

[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

答案 2 :(得分:21)

您可以拥有列表清单。使用以下命令将元组元组转换为列表列表:

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

level1 = map(list, level1)

并相应地修改它们。

numpy array更酷。

答案 3 :(得分: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)

方法2:

level1 = map(list,level1)

print(list(level1))

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

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

答案 4 :(得分:12)

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

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)

答案 5 :(得分:5)

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

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

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

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

答案 6 :(得分:3)

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

list comprehension可用于将元组的元组转换为列表列表:

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

答案 7 :(得分:2)

如果您只使用一个列表而不是列表列表,那么您可以大大加快您的工作速度。当然,只有当你的所有内部列表都具有相同的大小时才有可能(在你的例子中这是正确的,所以我假设这个)。

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时才有用。如果你需要更多的值,你必须将几个位组合在一起,这会使问题变得更加复杂。

答案 8 :(得分: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_as_list=[]
for i in level1:
    inside_list=[]
    for j in i:
        inside_list.append(j)
    level1_as_list.append(inside_list)

print(level1_as_list)enter code here

输出:

[[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]]

答案 9 :(得分:0)

列出元组并返回的步骤如下

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)