2015-05-04 101 views
0

我想讓我的頭繞着列表解析,我可以理解他們如何工作的基礎知識,但我覺得我應該能夠在這裏做我的代碼的東西,我只是似乎無法工作。在Python中使用列表理解與詞典

給出一個詞典:

{2: {11}, 9: {11, 8, 10}, 10: {11, 3}, 11: {7, 5}, 8: {7, 3}} 

有幾個片段的,我覺得我應該能降低到較少的線路,如果我知道更好:

for k, v in d.items(): 
    dag[k] = v 
    for val in v: 
     if val not in d.keys(): 
      dag[val] = None 

和:

t = [] 
for k, v in d.items(): 
    if not v: 
     t.append(k) 
     d.pop(k) 

我的嘗試已經變更:

for [k, v in d.items() if not v]: 

但是,這不斷告訴我它需要一個else語句,而且我讀過的所有內容都沒有幫助回答/如果這是可能的。

+0

清晰度比簡短性要好,所以只有在清晰度更高或清晰度更高的情況下才能縮短清晰度。這在Python中也往往很快。 –

回答

1

在您的第一個片段中,您基本上默認所有節點Nonedag。你可以顛倒這些步驟,並避免測試鍵已經存在共:

dag = dict.fromkeys(node for v in d.values() for node in v) 
dag.update(d) 

這產生與用於給定的鍵的所有None值的字典(從發電機表達來源),那麼更新爲插入所有已知的邊緣。

在您的代碼中,您使用了if val not in d.keys();這在功能上等同於if val not in d,但是沒有對d.keys()的冗餘調用,它創建了一個新對象(在Python 2中,包含所有鍵的列表,使得在Python 3中搜索多餘的效率低下,創建了字典視圖)。總是在那裏使用較短的形式。

請注意您在d中用作值的set對象現在與dag共享;您對這些設置所做的任何更改都會反映在兩個字典中。然後

創建節點的序列沒有值將是:

nodes_without_exits = [node for node, edges in d.items() if not node] 

列表解析仍然需要生產者表達,產生該值被插入到列表中的一部分;這裏是node,這個列表是用字典的鍵構建的。

1

如果你想保持有falsey按鍵值的語法是:

[ k for k, v in d.items() if not v] 

這相當於你最後循環欄中d.pop(k)這我不知道,如果你想。第一個k是我們追加到列表中的,for k, v是d.items中的每個鍵和值,而if not v表示我們只保留具有錯誤值的k。

如果你真的想沒有那些鍵和值的字典,你可以使用字典理解其中的邏輯是完全一樣的,除了我們正在創建的鍵/值配對,而不只是僅保留在列表中理解的關鍵:

{ k:v for k, v in d.items() if not v} 

關於你的第一個代碼,我不知道你想讓它做什麼,但你不應該叫.keys,在創建一個列表和使python2查找O(n),而不是0(1)和蟒蛇三是不必要的函數調用。