Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.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

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
Python 如何将杂乱无章的词典平铺到列表中?_Python_List_Dictionary - Fatal编程技术网

Python 如何将杂乱无章的词典平铺到列表中?

Python 如何将杂乱无章的词典平铺到列表中?,python,list,dictionary,Python,List,Dictionary,我试图将一个杂乱无章的字典(它又取自一个json文件)展平,以便于提取信息。下面是一个示例,说明了词典的结构以及我试图将其扁平化: data = {'horse':{'speed':{"walk": 40, "run":50}}, 'dog':{'run':30}, 'human':{'gait':{'normal':{'run': 25, 'walk': 30}}}} flat_dict = [] for items in list(data.items()): flat_list

我试图将一个杂乱无章的字典(它又取自一个json文件)展平,以便于提取信息。下面是一个示例,说明了词典的结构以及我试图将其扁平化:

data = {'horse':{'speed':{"walk": 40, "run":50}}, 'dog':{'run':30}, 'human':{'gait':{'normal':{'run': 25, 'walk': 30}}}}

flat_dict = []
for items in list(data.items()):
    flat_list = []
    flat_list.append(items[0])
    try:
        for item in list(items[1].items())[0]:
            if type(item) is not dict: 
                flat_list.append(item)
            else:
                flat_list.append(list(item.keys())[0])
                flat_list.append(list(item.values())[0])
    except:
        flat_list.append(items[0])
    flat_dict.append(flat_list)

print(flat_dict)
但是,上面的代码并没有使整个字典变平,并且一些信息丢失,下面是上面代码的输出:

[['horse', 'speed', 'walk', 40], ['dog', 'run', 30], ['human', 'gait', 'normal', {'run': 25, 'walk': 30}]]
我想要的是:

[['horse', 'speed', 'walk', 40, 'run', 50], ['dog', 'run', 30], ['human', 'gait', 'normal', 'run', 25, 'walk', 30]]

我该怎么办?

您可以使用递归方法来理解列表:

 def gen(d):
    if isinstance(d, dict):
        for k, v in d.items():
            yield k
            yield from gen(v)
    else:
        yield d 

[[k, *gen(v)] for k, v in data.items()]
输出:

 [['horse', 'speed', 'walk', 40, 'run', 50],
 ['dog', 'run', 30],
 ['human', 'gait', 'normal', 'run', 25, 'walk', 30]]

由于您不知道
dict
中的结构,您不能使用简单的循环来处理每种情况,您需要使用递归,我建议使用一种实用方法来递归展平任何结构,然后使用它来制作
[键,展平(值)]

答复如下:

data = {
    'horse': {
        'speed': {
            "walk": 40, "run": 50}},
    'dog': {
        'run': 30},
    'human': {
        'gait': {
            'normal': {
                'run': 25, 'walk': 30}}}}


def my_flatten(ddict, mylist):
    for k, v in ddict.items():
        if isinstance(v, dict):
            mylist.append(k)
            my_flatten(v, mylist)
        else:
            mylist.extend([k, v])
    return mylist


flist = [my_flatten(v, [k]) for k, v in data.items()]
print(flist)

你能展示你的预期结果吗?为什么你需要把它放在一个列表中?从字典中提取信息已经很容易了。Google python dictionaries.a“*”在函数名前面有什么作用,就像您给出的“*gen(v)”?您可以在我的阅读中阅读更多关于
*
iterable unpacking运算符的内容,但没有找到您在answer@Sankar简短回答:将把函数
gen
î生成的所有元素放在列表中,更好吗?
data = {
    'horse': {
        'speed': {
            "walk": 40, "run": 50}},
    'dog': {
        'run': 30},
    'human': {
        'gait': {
            'normal': {
                'run': 25, 'walk': 30}}}}


def my_flatten(ddict, mylist):
    for k, v in ddict.items():
        if isinstance(v, dict):
            mylist.append(k)
            my_flatten(v, mylist)
        else:
            mylist.extend([k, v])
    return mylist


flist = [my_flatten(v, [k]) for k, v in data.items()]
print(flist)