2017-10-13 57 views
3

我有形式的元組:交換對象 - 蟒

a[i][j][k] 

ķ∈[0,1] 一個由對象T,被包括在列表中的球隊。

我想要的是交換所有對a [i] [j] [0]和a [i] [j] [1]的位置。所以:

a[i][j][0], a[i][j][1] = a[i][j][1], a[i][j][0] 

作爲是一個元組,我的理解是不可改變的,這是什麼原因,這不起作用:

for i in range(0, len(teams)-1): 
    for j in range(0, len(teams)/2): 
     a[i][j][0],a[i][j][1] = a[i][j][1],a[i][j][0] 

我試圖轉換到一個列表(L =名單(a)),但沒有成功。

有人可以幫我建議嗎?對不起萬一我nomenclatur還不完善,這是我的第一個問題,關於SO :)

感謝

+2

我們需要看到一個[MCVE。是元組元組的一個元組? –

+0

'隊'從哪裏來? – arsho

+0

最外層是元組還是列表? – James

回答

4

假設atupletuple S的tuple秒。

我會

  • 將其轉換成列表的列表
  • 做我想做的事情
  • 將其轉換回原來的格式,如果需要的列表

例如:

a = (((1,2),(3,4)),((10,20),(30,40))) 

a_as_list = [[list(x) for x in b] for b in a] 

print(a_as_list) 

# now manipulate elements: 

a_as_list[0][0] = [a_as_list[0][0][1],a_as_list[0][0][0]] 

a_as_tuple = tuple(tuple(tuple(x) for x in b) for b in a_as_list) 


print(a_as_tuple) 

結果:

[[[1, 2], [3, 4]], [[10, 20], [30, 40]]] 
(((2, 1), (3, 4)), ((10, 20), (30, 40))) 

如你所見,元組轉換爲列表,製作,再轉換回元組

編輯:如果a是元組的列表的列表,你可以這樣做:

a[i][j][0], a[i][j][1] = a[i][j][1], a[i][j][0] 

但你可以重新創建內部的元組:

a[i][j] = a[i][j][1],a[i][j][0] 
+0

謝謝。這是我現有報價的快速解決方案。 –

+0

@ MaximilianA.Graves看我的編輯,應該夠了 –

+0

完美。我想我必須閱讀和學習更多有關列表和元組之間的區別。但這已經非常有幫助! –

1

我們可以簡單地做到這一點使用PYT HON的reversed

a[j][k] = tuple(reversed(a[j][k])) 
+0

我也會試試這個。這真的看起來更經濟。 –

1

問題

元組是immutables確實如此。 a可能是一個列表,甚至是一個列表的列表。所以這個代碼:

L = list(a) 

不會改變任何東西。問題似乎是a是元組列表的列表。a[i][j]是一個元組,這是不可能的新值分配給它:

>>> t = ('a', 'b') 
>>> t[0] = 'b' 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'tuple' object does not support item assignment 

可能的解決方法

如果你有3 d矩陣工作,numpy或許可以幫助你。它支持advanced indexing and slicing

>>> import numpy as np 
>>> table = np.arange(18).reshape(3,3,2) 
>>> table 
array([[[ 0, 1], 
     [ 2, 3], 
     [ 4, 5]], 

     [[ 6, 7], 
     [ 8, 9], 
     [10, 11]], 

     [[12, 13], 
     [14, 15], 
     [16, 17]]]) 
>>> table[:, :, [0, 1]] = table[:, :, [1, 0]] 
>>> table 
array([[[ 1, 0], 
     [ 3, 2], 
     [ 5, 4]], 

     [[ 7, 6], 
     [ 9, 8], 
     [11, 10]], 

     [[13, 12], 
     [15, 14], 
     [17, 16]]]) 

矩陣內的元素不必是數字,它們可以是任何對象:

>>> class T(str): 
... pass 
... 
>>> T('test') 
'test' 
>>> m = np.array([[(T(1), T(2))],[(T(3), T(4))]]) 
>>> m[:, :, [0, 1]] = m[:, :, [1, 0]] 
>>> m 
array([[['2', '1']], 

     [['4', '3']]], 
     dtype='<U1') 
+0

非常感謝。我也會玩弄numpy! –