簡體   English   中英

使用生成器或理解從字典中創建一個2元組列表?

[英]Make a 2-tuple list from a dictionary using a generator or comprehension?

從字典看起來像:

newdict = {'1':{'label':'10232'},'2':{'label':'2420'},'3':{'label':'3530'},...}

如何創建以下元組列表?

newlist = [(1,10232),(2,2420),(3,3530)]

我認為我的列表理解不正確:

[newlist(k,k['label']) for (k,v) in newdict.items()]

這有效:

newlist = [(k,v['label']) for (k,v) in newdict.items()]

這是一個完全可重現的例子:

>>> newdict = {'1':{'label':'10232'},'2':{'label':'2420'},'3':{'label':'3530'}}
>>> newlist = [(k,v['label']) for (k,v) in newdict.items()] 
>>> newlist 
[('1', '10232'), ('3', '3530'), ('2', '2420')]
>>> 

如果您希望元組為int,則只需將值轉換為int,如下所示:

>>> newlist = [(int(k),int(v['label'])) for (k,v) in newdict.items()] 
>>> newlist
[(1, 10232), (3, 3530), (2, 2420)]
>>> 

說明

newdict.items()是一個迭代器,雖然是字典的(鍵,值)對的列表。 所以,你的第一個錯誤是試圖訪問label的關鍵k['label']而不是在價值訪問它v['label']

第二個問題是,你試圖調用列表newlist ,如果它是一個功能newlist(k,k['label']) newlist只是一個變量,您可以將結果列表分配給它。

您不需要調用newlist ,您可以使用v訪問該子目錄:

>>> [(k, v['label']) for (k,v) in newdict.items()]
[('3', '3530'), ('2', '2420'), ('1', '10232')]

但是字典是無序的,因此如果您計划按鍵排序,則必須使用已sorted

>>> [(k, v['label']) for (k,v) in sorted(newdict.items())]
[('1', '10232'), ('2', '2420'), ('3', '3530')]

或使用OrderedDict而不是普通的dict作為newdict

>>> from collections import OrderedDict
>>> newdict = OrderedDict([('1', {'label':'10232'}), ('2',{'label':'2420'}), ('3',{'label':'3530'})])
>>> [(k, v['label']) for (k,v) in newdict.items()]
[('1', '10232'), ('2', '2420'), ('3', '3530')]
>>> newlist = [(k,v['label']) for (k,v) in newdict.items()]
>>> newlist
[('1', '10232'), ('3', '3530'), ('2', '2420')]

如果你還想要整數,你必須添加int():

newlist = [(int(k),int(v['label'])) for (k,v) in newdict.items()]

你可以試試這個:

newdict = {'1':{'label':'10232'},'2':{'label':'2420'},'3':{'label':'3530'},...}

final_dict = [(a, list(b.items())[-1][-1]) for a, b in newdict.items()]

輸出:

[('1', '10232'), ('3', '3530'), ('2', '2420')]

嘗試:

>>> newdict = {'1':{'label':'10232'},'2':{'label':'2420'},'3':{'label':'3530'}}
>>> [(int(k),int(v['label'])) for k,v in newdict.items()]
[(1, 10232), (2, 2420), (3, 3530)]
>>>

暫無
暫無

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

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