[英]Convert tuple to list and back
我目前正在使用平鋪地圖為 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
但是由於級別存儲在一個元組中,我無法更改不同塊的值。 如何以簡單的方式更改關卡中的不同值?
將元組轉換為列表:
>>> 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)
並相應地修改它們。
但是numpy 數組更酷。
將元組轉換為列表
(給定問題中元組之間缺少逗號,添加它是為了防止出現錯誤消息)
方法一:
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)
方法二:
level1 = map(list,level1)
print(list(level1))
方法 1 耗時 --- 0.0019991397857666016 秒 ---
方法 2 耗時 --- 0.0010001659393310547 秒 ---
為什么不嘗試將其類型從元組轉換為列表,反之亦然。
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)
從 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)
列表推導式可用於將元組元組轉換為列表列表:
>>> 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
兩個答案都很好,但有一點建議:
元組是不可變的,這意味着它們不能改變。 所以如果需要操作數據,最好將數據存放在一個列表中,這樣會減少不必要的開銷。
在您的情況下,將數據提取到一個列表中,如 eumiro 所示,並在修改后創建一個類似結構的類似元組作為 Schoolboy 給出的答案。
同樣建議使用 numpy array 是更好的選擇
列表到元組並返回可以如下完成
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)
如果您只使用一個列表而不是列表列表,則可以顯着加快您的工作速度。 當然,只有當所有內部列表的大小相同時才可能這樣做(在您的示例中是這樣,所以我只是假設這一點)。
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 時才有效。 如果您需要更多值,則必須組合多個位,這會使問題變得更加復雜。
僅使用命令列表對我不起作用。
如果你有一個元組,只需迭代直到你有必要的元素,然后追加到列表中。 如果您轉到元素級別,則可以輕松更改它。
輸入:
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]]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.