Python:打印复杂数据结构的所有值(不包括哈希键)
基本上,我有一个非常复杂且冗长的数据结构。为了简单起见,它大致看起来像这样:
{'tom':'stats', 'keys':[{'tim': 'doc', 'year': 1999},{'mum':'veg', 'nba':'qweqwe'}] }
这是一个字典,里面有字符串和整数的值。不过,有时候这些值可能是一个 list
,而这个列表里又可以包含字典。
我想写一个函数,能够递归地打印出这个数据结构里的所有内容。有没有人能告诉我该怎么做?
编辑
抱歉,我没有把问题解释清楚。我知道可以用 pprint
和 json
来很好地打印出来。但这不是我想要的。
我希望输出的格式看起来像这样:stats, doc,1999, veg , qweqwe
我正在处理的复杂数据结构的一个例子是:
{'edw': {'_tot': 1, 'val': [{'sd': {'yr': 93}, 'Date': {'r': 19}, 'deg': 'B', 'skl': 'Uni', 'field': 'sports', 'phonenum': 5121123}]}}
更新
非常感谢大家的精彩回答!我真的学到了很多。
4 个回答
注意,输出的顺序和原始数据的顺序是一样的。我留给你去想一个排序的方法 :-)
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
用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"
}
这段代码会返回一个包含所有值的列表,前提是你的字典格式是一样的:
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
在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。这些问题可能会让我们感到困惑,尤其是当我们刚开始学习编程的时候。比如,有人可能会在使用某个特定的功能时,发现它的表现和预期不一样。这种情况很常见,尤其是在处理复杂的代码或系统时。
解决这些问题的关键是理解背后的原理和逻辑。很多时候,问题的根源可能在于我们对某些概念的理解不够深入,或者是我们没有正确使用工具的方式。因此,遇到问题时,首先要冷静下来,仔细阅读相关的文档和说明,看看是否有我们忽略的细节。
此外,向社区求助也是一个好办法。像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)