Python:打印出复杂数据结构的所有值(不包括散列键)

时间:2014-07-02 22:38:40

标签: python list recursion dictionary

基本上,我有一个非常冗长和复杂的数据结构。为简化起见,它基本上如下所示:

{'tom':'stats', 'keys':[{'tim': 'doc', 'year': 1999},{'mum':'veg', 'nba':'qweqwe'}] }

这是一个包含字符串值和整数值的字典。但是,有时值可以是list,该列表可以包含字典。

我想编写一个递归打印出数据结构中所有内容的函数。有人能告诉我这是怎么做到的吗?

修改 抱歉。我没有正确解释这个问题。我知道我可以使用pprintjson将其打印出来。但这不是我想要的。 我希望输出看起来像这样: stats, doc,1999, veg , qweqwe

我正在使用的复杂数据结构示例如下:

{'edw': {'_tot': 1, 'val': [{'sd': {'yr': 93}, 'Date': {'r': 19}, 'deg': 'B', 'skl': 'Uni', 'field': 'sports', 'phonenum': 5121123}]}}

更新

非常感谢你们所有出色的答案!我真的学到了很多东西。

4 个答案:

答案 0 :(得分:3)

d = {'tom':'stats', 'keys':[{'tim': 'doc', 'year': 1999},{'mum':'veg', 'nba':'qweqwe'}] }

def print_all_values(input):
    if isinstance(input, dict):
        for key, value in input.items():
            print_all_values(value)
    elif isinstance(input, list):
        for value in input:
            print_all_values(value)
    else:
        print(input)

print_all_values(d)

答案 1 :(得分:2)

使用json执行此操作很难:

rd={'tom':'stats'  , 'keys':[{'tim': 'doc', 'year': 1999},{'mum':'veg', 'nba':'qweqwe'}] }

import json
print json.dumps(rd, sort_keys=True, indent=4)

打印:

{
    "keys": [
        {
            "tim": "doc", 
            "year": 1999
        }, 
        {
            "mum": "veg", 
            "nba": "qweqwe"
        }
    ], 
    "tom": "stats"
}

答案 2 :(得分:2)

这将返回所有值的列表,假设您的实际dicts遵循相同的格式:

def get_vals(items):
    final=[]
    for elem in items.itervalues():
        if isinstance(elem, dict):
            final += elem.values()
        elif isinstance(elem, list):
            for sub_elem in elem:
                    final += sub_elem.values()
        else:
            final.append(elem)
    return final


print (get_vals(d))
['doc', 1999, 'veg', 'qweqwe', 'stats']

在更复杂的结构上试试这个:

def flatten(items):
    final = []
    if isinstance(items, dict):
        for val in items.itervalues():
            final += flatten(val)
    elif isinstance(items, list):
        for elem in items:
            final += flatten(elem)
    else:
        final.append(items)
    return final

答案 3 :(得分:0)

请注意,输出镜像原始数据的顺序。我会把它留给你一种: - )

import inspect

def extractValuesFromList(results_,list_):

    for item_ in list_:
        print '%s %s %s' % (inspect.stack()[0][3],type(item_),item_)
        if type(item_) == list:
            extractValuesFromList(results_,item_)
        elif type(item_) == dict:
            extractValuesFromDictionary(results_,item_)

def extractValuesFromDictionary(results_,dict_):

    for key_ in dict_.keys():
        value_ = dict_[key_]
        print '%s %s %s' % (inspect.stack()[0][3],type(value_),value_)
        add_ = False 
        type_ = type(value_)
        if type_ == str:
            add_ = True
        elif type_ == int:
            add_ = True
            value_ = str(value_)
        elif  type_ == dict:
            extractValuesFromDictionary(results_,value_)
        elif type_ == list:
            extractValuesFromList(results_,value_)
        else:
            print 'Unsupported type %s' % (type(value_))   

        if add_:
            results_.append(value_)


data_ = {'tom':'stats', 'keys':[{'tim': 'doc', 'year': 1999},{'mum':'veg', 'nba':'qweqwe'}] }
print data_

separator_ = ','
results_ = []

extractValuesFromDictionary(results_,data_)

print separator_.join(results_)    

输出继电器

python print_out_complicated_structure.py

{'keys':[{'tim':'doc','year':1999},{'mum':'veg','nba':'qweqwe'}],'tom':'stats “}

extractValuesFromDictionary [{'tim':'doc','year':1999},{'mum':'veg','nba':'qweqwe'}]

extractValuesFromList {'tim':'doc','year':1999}

extractValuesFromDictionary doc

extractValuesFromDictionary 1999

extractValuesFromList {'mum':'veg','nba':'qweqwe'}

extractValuesFromDictionary veg

extractValuesFromDictionary qweqwe

extractValuesFromDictionary stats

文档,1999,蔬菜,qweqwe,统计