簡體   English   中英

在Python中使用列表推導和字典

[英]Using List Comprehension with Dictionaries in 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語句,而我所讀的內容都沒有幫助回答如何/是否可能。

如果要保留具有假值的鍵,則語法為:

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

那相當於您最后一個循環條d.pop(k) ,我不確定是否要。 第一個k是我們追加到列表中的內容, for k, v是d.items中的每個鍵和值, if not v意味着我們僅保留具有假值的k。

如果您實際上想要不帶這些鍵和值的字典,則可以使用dict理解,其邏輯完全相同,只是我們創建鍵/值對,而不僅僅是將鍵保留在列表中:

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

至於您的第一個代碼,我不確定您希望它執行什么操作,但是您不應該在python2中調用.keys ,它會創建一個列表並進行查找O(n)而不是0(1)和python 3這是不必要的函數調用。

在第一個代碼段中,實際上是將dag中的所有節點默認為None 您可以反轉這些步驟,並避免測試已完全存在的密鑰:

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字典視圖已創建)。 始終在此處使用較短的形式。

請注意,現在與dag共享了您在d中用作值的set對象; 您對這些集合所做的任何更改都會反映在兩個詞典中。

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

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

列表理解仍然需要生產者表達式 ,即產生值的部分要插入到列表中; 這里是node ,列表是根據字典的鍵構建的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM