问题:将元组转换为列表并返回
我目前正在使用平铺地图为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
但是由于级别存储在元组中,因此我无法更改不同块的值。如何轻松更改级别中的不同值?
I’m currently working on a map editor for a game in pygame, using tile maps.
The level is built up out of blocks in the following structure (though much larger):
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))
where “1” is a block that’s a wall and “0” is a block that’s empty air.
The following code is basically the one handling the change of block type:
clicked = pygame.mouse.get_pressed()
if clicked[0] == 1:
currLevel[((mousey+cameraY)/60)][((mousex+cameraX)/60)] = 1
But since the level is stored in a tuple, I’m unable to change the values of the different blocks. How do I go about changing the different values in the level in an easy manner?
回答 0
将元组转换为列表:
>>> 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')
Convert tuple to list:
>>> t = ('my', 'name', 'is', 'mr', 'tuple')
>>> t
('my', 'name', 'is', 'mr', 'tuple')
>>> list(t)
['my', 'name', 'is', 'mr', 'tuple']
Convert list to tuple:
>>> l = ['my', 'name', 'is', 'mr', 'list']
>>> l
['my', 'name', 'is', 'mr', 'list']
>>> tuple(l)
('my', 'name', 'is', 'mr', 'list')
回答 1
你有一个元组。
要将每个元组转换为列表:
[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
You have a tuple of tuples.
To convert every tuple to a list:
[list(i) for i in level] # list of lists
— OR —
map(list, level)
And after you are done editing, just convert them back:
tuple(tuple(i) for i in edited) # tuple of tuples
— OR — (Thanks @jamylak)
tuple(itertools.imap(tuple, edited))
You can also use a numpy array:
>>> 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]])
For manipulating:
if clicked[0] == 1:
x = (mousey + cameraY) // 60 # For readability
y = (mousex + cameraX) // 60 # For readability
a[x][y] = 1
回答 2
您可以有一个列表列表。使用以下命令将您的元组元组转换为列表列表:
level1 = [list(row) for row in level1]
要么
level1 = map(list, level1)
并进行相应的修改。
但是一个numpy的数组更酷。
You can have a list of lists. Convert your tuple of tuples to a list of lists using:
level1 = [list(row) for row in level1]
or
level1 = map(list, level1)
and modify them accordingly.
But a numpy array is cooler.
回答 3
将元组转换为列表
(给定问题中的元组之间缺少逗号,已添加它以防止出现错误消息)
方法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秒-
To convert tuples to list
(Commas were missing between the tuples in the given question, it was added to prevent error message)
Method 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)
Method 2:
level1 = map(list,level1)
print(list(level1))
Method 1 took — 0.0019991397857666016 seconds —
Method 2 took — 0.0010001659393310547 seconds —
回答 4
为什么不尝试将其类型从元组转换为列表,反之亦然。
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)
Why don’t you try converting its type from a tuple to a list and vice versa.
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
两种答案都不错,但有一点建议:
元组是不可变的,这意味着它们不能更改。因此,如果需要处理数据,最好将数据存储在列表中,这样可以减少不必要的开销。
在您的情况下,将数据提取到一个列表中,如eumiro所示,并在修改后创建一个类似于Schoolboy给出的结构的类似元组。
另外如建议使用numpy数组是一个更好的选择
Both the answers are good, but a little advice:
Tuples are immutable, which implies that they cannot be changed. So if you need to manipulate data, it is better to store data in a list, it will reduce unnecessary overhead.
In your case extract the data to a list, as shown by eumiro, and after modifying create a similar tuple of similar structure as answer given by Schoolboy.
Also as suggested using numpy array is a better option
回答 6
列出到元组并返回可以如下
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)
List to Tuple and back can be done as below
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)
回答 7
如果仅使用一个列表而不是一个列表,则可以大大加快工作速度。当然,只有在您所有内部列表的大小都相同的情况下才有可能(这在您的示例中是正确的,因此我假设是这样)。
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的情况下有效。如果需要更多值,则必须合并几个位,这会使问题变得更加复杂。
You could dramatically speed up your stuff if you used just one list instead of a list of lists. This is possible of course only if all your inner lists are of the same size (which is true in your example, so I just assume this).
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)
And you could be even faster if you used a bitfield instead of a list:
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)
with
def mask(x, y):
return 1 << (WIDTH-x + y*WIDTH)
But that’s working only if your fields just contain 0 or 1 of course. If you need more values, you’d have to combine several bits which would make the issue much more complicated.