簡體   English   中英

Python:使用lambda從列表中使用列表理解來創建字典

[英]Python: Creating a dictionary using list comprehension from a list using lambda

從概念上講,這是我想要做的:

lookup = {'A': 'aaa', 'B': 'bbb', 'C': 'ccc'}
keys = ['A', 'B', 'Z'] # Note 'Z' does not exist in dict
result = {}
for key in keys:
    if key in lookup:
        result[key] = lookup[key]
    else:
        result[key] = None

上面的代碼產生以下內容,即

# result == {'A': 'aaa', 'Z': None, 'B': 'bbb'}

根據本文中有關字典理解語法的建議,我可以使用v2.6語法執行以下操作:

result = dict((lambda x: (x, lookup[x]) if x in lookup else (x, None))(key) for key in keys)

哪個起作用並產生相同的結果。

但是,我希望能夠以v2.7樣式執行以下操作(在上面的帖子中也提到了)。 但這似乎不起作用,

result = { (lambda x: x: a_dict[x] if x in a_dict else x: None)(key) for key in a_list }

我似乎相抵觸使用的運行:在表示一鍵拉姆達這一點。 我還回顧了原始PEP中給出的示例。 他們也沒有提供任何指導。 以下是命令行的輸出:

>>> result = { (lambda x: x : a_dict[x] if x in a_dict else x: None)(key) for key in a_list }
  File "<stdin>", line 1
    result = { (lambda x: x : a_dict[x] if x in a_dict else x: None)(key) for key in a_list }
                            ^
SyntaxError: invalid syntax

我究竟做錯了什么? 是否可以做我想做的事情,即使用Lambda字典理解的v2.7語法?

請注意,我只是出於好奇而問。 並不是我有寫這樣的生產代碼的強迫性,而是需要專家理解的代碼!

PS:我應該提到另外兩個相關的帖子,在嘗試執行此操作時我發現它們很有幫助。 首先是在列表理解中使用lambda。 另一個是使用list創建字典

若要使用字典理解功能進行操作,應使用dict.get()方法。 范例-

>>> lookup = {'A': 'aaa', 'B': 'bbb', 'C': 'ccc'}
>>> keys = ['A', 'B', 'Z']
>>> result = {key:lookup.get(key) for key in keys}
>>> result
{'Z': None, 'A': 'aaa', 'B': 'bbb'}

如果字典中不存在鍵,則dict.get()返回None 您也可以為dict.get()指定第二個參數,如果要獲取的鍵在詞典中不存在,則該參數將作為返回的默認值。


要回答這個問題,您不能使用lambda在字典lambda中返回類似key:value的對(因為:語法無效)。 如果要這樣做,則應將dict()函數與生成器表達式結合使用,例如-

result = dict((lambda x: (x,a_dict[x]) if x in a_dict else (x,None))(key) for key in a_list)

或更易讀的map()版本-

result = dict(map((lambda x: (x,a_dict[x]) if x in a_dict else (x,None)), a_list)

您可以嘗試通過簡單的字典理解來完成以下任務:

result = {k: lookup.get(k) for k in keys}

k是鍵, lookup.get(k)是值。 .get()將從字典中獲取鍵的值;如果不存在,則從None 也可以將默認值設置為第二個參數。

暫無
暫無

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

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