2017-05-07 55 views
0

我有一個Python列表x = [['a',1], ['b',3],['d',5]],我想第二列的值存儲在一個新的列表y = [['a',1], ['b',3], ['c',0], ['d',5]] 不一定是第名單將有全部,B,C,d項。 這是我現在所擁有的:的Python:手柄Python列表

x = [['a',1], ['b',3],['d',5]] 
    y = [] 
    b = ('a','b','c','d') 
    for key in b: 
     for i, sublist in enumerate(x): 
      if sublist[0] == key: 
       y.append(sublist) 
      else 
       y.append([key,0]) 
    print y 

這給:

[['a', 1], ['a', 0], ['a', 0], ['b', 0], ['b', 3], ['b', 0], ['c', 0], ['c', 0], ['c', 0], ['d', 0], ['d', 0], ['d', 5]] 

它是什麼,我做錯了什麼?

+0

你最終只是想確保列表x中的鍵是在列表b?因爲如果是這樣的話,你不需要像這樣嵌套循環。這又意味着你應該使用'in'關鍵字來代替。此外,我不確定你在尋找比賽時的目標。你是否希望隨時更新最新的價值? – idjaw

+0

每次在for循環中,您都在檢查條件並追加到列表中。這是如此之久的結果 – bigbounty

回答

1

作爲第一種方法(有點類似,你打算寫什麼的),我們可以使用顯式的循環:

x = [['a', 1], ['b', 3], ['d', 5]] 
b = ['a', 'b', 'c', 'd'] 
y = [] 

for key in b: 
    for k, v in x: 
    if key == k:  # if the key was found 
     y.append([k, v]) # add it with its value 
     break   # and break from the loop 
    else: 
    y.append([key, 0]) # if the key was not found, add it with 0 value 

一個更好的方法是使用一個字典來加速查找和列表修真甚至更快的處理:

d = dict(x) 
y = [[k, d[k]] if k in d else [k, 0] for k in b] 

無論哪種方式,它按預期工作:

print y 
=> [['a', 1], ['b', 3], ['c', 0], ['d', 5]] 
+1

Down voteer:care to comment?我的答案給出了預期的結果! –

+0

我不是downvoter。但是,我認爲這裏的一個好的答案是幫助OP瞭解,根據他們正在嘗試做的事情,這不是靠近最好的方法。很明顯,他們試圖根據b中存在的列表x中的鍵來執行操作。那麼爲什麼不幫助提供一個解釋來幫助OP學習一些關於正確檢查的事情:又名'如果鍵入b'?而且,在代碼中添加這些註釋之前,downvote就出現了。 – idjaw

+0

「之前的路」,是的,就像之前的50秒。我還在編輯這個問題時,它被拒絕投票,沒有任何解釋 –

1
#setup an eampty dict with all the required keys 
y = {e:0 for e in b} 
#populate elements of y using elements from x 
y.update(x) 
#convert the dict to a list in the required format. 
y = [[k,v] for k,v in y.items()] 

Out[133]: [['a', 1], ['b', 3], ['c', 0], ['d', 5]] 
+0

OP期望一個_list_作爲輸出,而不是一個字典 –

+0

複製中間輸出並已修復。 – Allen

0

一個明顯的錯誤說法是

if sublist[0] == key: 
    y.append(sublist) 
else 
    y.append([key,0]) 

這樣你插入一對[key, 0]x每一個元素具有不同的密鑰。

但是你應該考慮稍微改寫你的算法。例如,如果xdict而不是關聯列表,則不必遍歷它以測試關鍵字。