[英]Pythonic way to flatten a dictionary into a list using list comprehension
我有以下功能:
def create_list_from_dict1(mydict):
output = []
for k, v in openint_dict.items():
output.append( (k, v['field1'], v['field2'], v['field3']) )
return output
本质上,它使字典变平,以便我可以对返回列表中元组的字段之一进行排序。
我不喜欢必须“硬编码”值字典的字段名称( 'field1'
,..., 'fieldN'
) 'fieldN'
,而我想要一种更加Python化且优雅的方式来做到这一点该函数适用于所有包含固定结构(非嵌套)字典作为其值的字典。
我想我将不得不使用**kwargs
和/或lambda
函数以及列表推导。 编写此函数的最pythonic方法是什么?
这可能会解决您的问题:
def create_list_from_dict1(mydict):
return [
(key,) + tuple(v for _, v in sorted(val.items()))
for key, val in sorted(mydict.items())
]
这假定:
key
进行sorted
); 请注意,在内部和外部循环中都使用.items
来按键对它们进行排序(在第一个元素上排序了两个元组,第二个元素仅用于打破平局),而常规的_
标识符则表示“我们不会使用再这样” 。
正在使用:
>>> create_list_from_dict1({
'hello': {'foo': 1, 'bar': 2, 'baz': 3},
'world': {'foo': 4, 'bar': 5, 'baz': 6},
})
[('hello', 2, 3, 1), ('world', 5, 6, 4)]
您可以这样做:
fields = ("field1", "field2", "field3")
output = [[k] + [mydict[k].get(x) for x in fields] for k in mydict]
在该代码中,我们迭代dict键,并将它们与第二级词典值的选定子集相加。
如果顺序没关系...
def create_list_from_dict1(mydict):
output = []
for k, v in openint_dict.items():
fields = [value for key, value in v.items()]
output.append( tuple([k] + fields )
return output
如果订单很重要,则您需要像以前一样做,并专门调出字段...或者您需要对子字典使用OrderedDict
。
Python dict
具有keys()
和values()
方法来获取键和值的列表。 如果字段的顺序不重要:
[(k,) + tuple(v.values()) for k, v in mydict]
如果值的顺序很重要:
[(k,) + tuple([v[i] for i in sorted(v.keys())]) for k, v in mydict]
请注意,第二个选项将与第一个选项相同,而无需调用sorted()
。 顺序取决于将事物添加到子对象的方式,因此您应尽可能使用第二个选项。
def create_list_from_dict1(mydict):
return [tuple([k]+list(v.values())) for k,v in openint_dict.items()]
不使用字段的名称并产生相同的结果。
在Python 3.5中,您可以键入(因为在任何地方都可以使用加星号的表达式):
def create_list_from_dict1(mydict):
return [(k,*v.values()) for k,v in openint_dict.items()]
我认为这将是pythonic:
[(k, v) for k, v in dict_data.items()]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.