簡體   English   中英

將元組轉換為列表並返回

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM