使用列表理解将字典展平为列表的Pythonic方法

时间:2015-10-30 16:25:39

标签: python list dictionary

我有以下功能:

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'),我想要一个更加pythonic和优雅的方式来执行此操作,以便此函数适用于包含固定结构的所有字典(非嵌套)字典作为其值。

我想我必须使用**kwargs和/或lambda函数,以及列表理解。写这个函数的最pythonic方法是什么?

6 个答案:

答案 0 :(得分:3)

可能会解决您的问题:

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来按键排序(两个元组在第一个元素上排序,第二个元素仅用于断开关系)和传统的{{1} 的标识符"我们不再使用它"

使用中:

_

答案 1 :(得分:2)

你可以这样做:

fields = ("field1", "field2", "field3")

output = [[k] + [mydict[k].get(x) for x in fields] for k in mydict]

在该代码中,我们迭代dict键并使用选定的二级词典值子集添加它们。

答案 2 :(得分:0)

如果订单无关紧要......

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作为子字符。

答案 3 :(得分:0)

Python dictkeys()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()的第一个选项相同。订单取决于如何将内容添加到子文档中,因此您应尽可能使用第二个选项。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

我认为这是pythonic:

// ...

import { doSomethingWithData } from './someModule'

// ...

axios.post(url + '/qget?sub=' + sub)
.then(data => {
    console.log(data)
    doSomethingWithData(data)
})
.catch(err => console.log(err)); 

// ...