使用生成器或理解从字典中创建一个2元组列表?

时间:2017-08-10 13:53:01

标签: python list dictionary tuples list-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()]

5 个答案:

答案 0 :(得分:5)

这有效:

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只是一个变量,您可以将结果列表分配给它。

答案 1 :(得分:2)

您不需要致电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代替普通字典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')]

答案 2 :(得分:1)

>>> 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()]

答案 3 :(得分:0)

你可以试试这个:

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')]

答案 4 :(得分:0)

尝试:

>>> 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)]
>>>