Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用列表理解将词典扁平化为列表的Pythonic方法_Python_List_Dictionary - Fatal编程技术网

使用列表理解将词典扁平化为列表的Pythonic方法

使用列表理解将词典扁平化为列表的Pythonic方法,python,list,dictionary,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 从本质上说,它使字典变得平坦,这样我就可以对返回列表中元组的一个字段执行排序 我不喜欢必须对值字典的字段名进行“硬编码”('fi

我有以下功能:

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'
),我需要一种更具python风格和优雅的方式来实现这一点,以便此函数适用于所有包含固定结构(非嵌套)字典作为其值的字典


我想我将不得不使用
**kwargs
和/或
lambda
函数以及列表理解。编写此函数的最佳方式是什么?

您可以这样做:

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):
    return [
        (key,) + tuple(v for _, v in sorted(val.items()))
        for key, val in sorted(mydict.items())
    ]
这假定:

  • 您希望输出中每个元组中的值具有相同的顺序
  • 您希望外部键和内部键按字母顺序排序(否则您需要为
    排序的
    键指定一个合适的
  • 您需要来自内部字典的所有键的值;及
  • 输入中的所有字典都包含所有相同的键(否则,每个元组中的条目会更多/更少,并且不能保证它们是对齐的)
请注意,在内部循环和外部循环中都使用了
.items
来按键排序(两个元组在第一个元素上排序,第二个元组仅用于断开连接)和用于“我们将不再使用此项”的常规
\ucode>标识符

使用中:

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

如果秩序不重要

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

如果顺序很重要,您需要像以前那样调用字段……或者您需要为子目录使用
orderedict

Python
dict
s有
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()
,第二个选项与第一个选项相同。顺序取决于如何将内容添加到子ct,因此应尽可能多地使用第二个选项

def create_list_from_dict1(mydict):
    return [tuple([k]+list(v.values())) for k,v in openint_dict.items()]
不使用字段的名称并产生相同的结果

在Python3.5中,您只需键入(因为到处都允许使用星号表达式):


我认为这是一个类似蟒蛇的故事:

[(k, v) for k, v in dict_data.items()]

那么你从一本字典开始?元组中的顺序重要吗?它们是否需要在元组之间保持一致?您正在为
v
字典中的一个子集提取值的键,还是全部?你能给出一个输入和可接受输出的例子吗?(很抱歉评论太长!)@jonrsharpe:答案的顺序与问题的顺序相同:是,是,是,否-键是股票代码,元组由市场数据组成。您可以相应地编辑问题,并添加一个示例吗?我将用调用
mydict.keys()
替换硬编码字段。否则,它看起来非常优雅,正是我想要做的。不过我会先试试。。。为了确保它有效,在接受您的答案之前。请注意python中的字典没有排序,因此使用
mydict.keys
可以混合您的数据。@HomunculusReticulli也将为您提供外部字典的键,它可能与内部字典不同(仍然没有示例?)是,我想我们讨论的是内部字典,因为字段是为它们硬编码的。问题是,不能保证每个内部字典中的
的顺序是相同的,OP将其作为一项要求进行了注释。不确定,但它似乎在“固定结构”上工作。我不知道是否有保证。这不是保证,这就是我要告诉你的。你能解释一下:
元组(v代表uu,
?我以前从未遇到过这种语法……看起来你在调用一个神奇的方法……下划线是什么意思?@HomunculusReticulli根据答案,
表示“我们没有使用它”(在本例中,是内部dict的键)。这就像
…对于k,v in…
,但更清楚地表明,
k
是故意被忽略的。谢谢你的解释。我想我会同意你的答案,因为这是最具python风格的。不过,我可能不得不用我自己的类对dict类进行子类化,该类将在函数中使用fields属性,而不是调用
sorted(val.items())
。元组是数据库中的记录,因此列的顺序不能更改。@HomunculusReticulli那么您确定要开始使用正确的数据结构吗?当然,数据来自数据库。
[(k, v) for k, v in dict_data.items()]