2012-12-06 131 views
9

我有一個列表的列表,列表中的每個列表包含5個項目,我如何更改列表中的項目的值?我曾嘗試以下:Python - 如何更改列表中的值?

for [itemnumber, ctype, x, y, delay] in execlist: 
     if itemnumber == mynumber: 
      ctype = myctype 
      x = myx 
      y = myy 
      delay = mydelay 

本來我有一個元組列表,但我意識到我不能在一個元組發生變化值,所以我切換到列表中,但我仍然不能改變任何值。如果我在for循環中打印ctype,x,y,delay,myctype,myx,myy或mydelay,則表明所有內容都正常工作,但如果我以後打印execlist,則看到沒有任何更改。

+0

'itemnumber's是唯一的嗎?或者還有另一個原因,即使在完成替換之後,您仍然想遍歷整個列表? –

回答

12

問題是您正在創建列表的副本,然後修改副本。你想要做的是修改原始列表。試試這個:

for i in range(len(execlist)): 
    if execlist[i][0] == mynumber: 
     execlist[i][1] = myctype 
     execlist[i][2] = myx 
     execlist[i][3] = myy 
     execlist[i][4] = mydelay 
2

您需要通過索引進行分配。假設你有一個列表清單,其中每個內部列表都有5個項目,如你所描述的。如果你想通過他們迭代並改變每個內部列表中的第二項的值,你可以這樣做:

l = [[0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [10, 11, 12, 13, 14]] 
for i in l: 
    i[1] = "spam" 

print l 
(output) [[0, "spam", 2, 3, 4], [5, "spam", 7, 8, 9], [10, "spam", 12, 13, 14]] 
0

可變拆包似乎並不通過參考,但複製的值。 的解決辦法是做這樣的:

foo = [[1, "gggg"], [3, "zzzz"]] 

for item in foo: 
    item[0] = 2 
    item[1] = "ffff" 

print(foo) 

>>>> [[2, 'ffff'], [2, 'ffff']] 
2

你可以使用enumerate()

for index, sublist in enumerate(execlist): 
    if sublist[0] == mynumber: 
     execlist[index][1] = myctype 
     execlist[index][2] = myx 
     execlist[index][3] = myy 
     execlist[index][4] = mydelay 
     # break 

可以刪除#如果execlist只包含至多一個子表,其第一項可以等於mynumber;否則,你將無用地遍歷整個列表的其餘部分。

而且如果itemnumbers其實都是獨一無二的,你可能會更好用字典或至少一個OrderedDict,這取決於你打算用你的數據做什麼。

0

不要在列表中分配局部變量。在循環

for i in lis: 
    i = 5 

只需將變量i 5和葉名單不變的實際內容。相反,你必須直接給它分配:

for i in range(len(lis)): 
    lis[i] = 5 

申請表的名單,雖然在這種情況下,本地變量沒有被分配,所以你可以使用for...in構築體的相同。

for i in listoflists: 
    for i2 in range(len(i)): 
      i[i2] = 5 #sets all items in all lists to 5 
0

更改在for中分配的變量不會更改列表。這是一個相當可讀的方式做你想要什麼:

execlist = [ 
    #itemnumber, ctype, x, y, delay 
    [1, 2, 3, 4, 5], 
    [6, 7, 8, 9, 10], 
    [11, 12, 13, 14, 15], 
] 

mynumber, myctype, myx, myy, mydelay = 6, 100, 101, 102, 104 

for i, sublist in enumerate(execlist): 
    if sublist[0] == mynumber: 
     execlist[i] = [mynumber, myctype, myx, myy, mydelay] 

print execlist 

輸出:

[[1, 2, 3, 4, 5], [6, 100, 101, 102, 104], [11, 12, 13, 14, 15]] 
0

,循環變量是原始的副本(Python沒有參考這樣的一個概念,雖然結構如列表通過參考引用)。你需要做的是這樣的:

for item in execlist: 
    if item[0] == mynumber: 
     item[1] = ctype 
     item[2] = myx 
     item[3] = myy 
     item[4] = mydelay 

item本身是一個副本太多,但它是原來的嵌套列表的引用的副本,所以當你是指它的元素原來的名單進行更新。

這不方便,因爲你沒有名字;也許字典或類將是一個更方便的結構。