繁体   English   中英

使用列表理解将字典平整为列表的Python方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM