2012-10-25 56 views
1

這聽起來像一個簡單的問題。但是,給定一個:修改「元組列表」結構中的某些內容而不破壞python中的結構

a = [[(1,2)], [(3,4), (5,6)], [(7,8), (9,10), (11,12)]] 

我怎麼能加1到每個元組的第一個項目,所以我得到的follwing?

b = [[(2,2)], [(4,4), (6,6), [(8,8), (10,10), (12,12)]] 

我試過代碼如下:

b = [] 

for list_of_tuples in a: 
    for num1, num2 in list_of_tuples: 
     b.append((num1+1, num2)) 

b 

但是,這會破壞原來的結構。那麼,怎樣才能得到我想要的,使用兩個for-loops?

回答

0

你幾乎在正確的軌道,但你也需要添加容器列表元組首先到B,重現原有的結構

a = [[(1,2)], [(3,4), (5,6)], [(7,8), (9,10), (11,12)]] 

b = [] 

for list_of_tuples in a: 
    b.append([]) 
    for num1, num2 in list_of_tuples: 
     b[-1].append((num1+1, num2)) 

print b 

輸出:

[[(2, 2)], [(4, 4), (6, 6)], [(8, 8), (10, 10), (12, 12)]] 
+0

謝謝,但是b [-1]在那裏意味着什麼? – user1775726

+0

b [-1]表示列表b中的最後一項,我們向b添加了一個列表並且正在訪問它,以便我們可以向它追加元組 –

4

使用嵌套列表理解:

>>> a = [[(1,2)], [(3,4), (5,6)], [(7,8), (9,10), (11,12)]] 
>>> b = [[(x+1, y) for x, y in tuples] for tuples in a] 
>>> b 
[[(2, 2)], [(4, 4), (6, 6)], [(8, 8), (10, 10), (12, 12)]] 

作爲for與清單理解:

b = [] 
for tuples in a: 
    b.append([(x+1, y) for x, y in tuples]) 

沒有任何列表理解:

b = [] 
for tuples in a: 
    tuples_b = [] 
    for x, y in tuples: 
     tuples_b.append((x+1, y)) 
    b.append(tuples_b) 
+0

哦,這太好了..我嘗試了列表理解..但是,我有b = [(x + 1,y)爲x,y爲元組中的元組],這意味着我沒有在另一箇中嵌入一個。 – user1775726

+0

+1。作爲一般規則,當你發現自己試圖找出如何修改結構時,問你是否可以使用理解來生成新副本。有時候不可能,或者太複雜,或者太空間效率太低,但大多數情況下這是正確的答案。 – abarnert

1

使用map()isinstance()

def func(x): 
    if isinstance(x,list): 
     return map(func,x) 
    elif isinstance(x,tuple): 
     return (x[0]+1,x[1]) 

a = [[(1,2)], [(3,4), (5,6)], [(7,8), (9,10), (11,12)]] 
print map(func,a) 

輸出:

[[(2, 2)], [(4, 4), (6, 6)], [(8, 8), (10, 10), (12, 12)]] 
0

你卡住了元組嗎?將它們轉換爲列表可能會更好,因爲您正在修改它們。