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

1 投票
4 回答
1531 浏览
提问于 2025-04-18 11:56

基本上,我有一个非常复杂且冗长的数据结构。为了简单起见,它大致看起来像这样:

{'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

注意,输出的顺序和原始数据的顺序是一样的。我留给你去想一个排序的方法 :-)

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'}

从字典中提取的值 [{'tim': 'doc', 'year': 1999}, {'mum': 'veg', 'nba': 'qweqwe'}]

从列表中提取的值 {'tim': 'doc', 'year': 1999}

从字典中提取的值 doc

从字典中提取的值 1999

从列表中提取的值 {'mum': 'veg', 'nba': 'qweqwe'}

从字典中提取的值 veg

从字典中提取的值 qweqwe

从字典中提取的值 stats

最终结果: doc,1999,veg,qweqwe,stats

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

这段代码会返回一个包含所有值的列表,前提是你的字典格式是一样的:

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

在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。这些问题可能会让我们感到困惑,尤其是当我们刚开始学习编程的时候。比如,有人可能会在使用某个特定的功能时,发现它的表现和预期不一样。这种情况很常见,尤其是在处理复杂的代码或系统时。

解决这些问题的关键是理解背后的原理和逻辑。很多时候,问题的根源可能在于我们对某些概念的理解不够深入,或者是我们没有正确使用工具的方式。因此,遇到问题时,首先要冷静下来,仔细阅读相关的文档和说明,看看是否有我们忽略的细节。

此外,向社区求助也是一个好办法。像StackOverflow这样的平台上,有很多经验丰富的程序员,他们乐于分享自己的知识和经验。通过提问或者搜索类似的问题,我们往往能找到解决方案或得到启发。

总之,编程是一条不断学习和探索的道路,遇到问题是很正常的。只要保持耐心,积极寻求帮助,就一定能找到解决办法。

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)

撰写回答