基本上,我有一个非常冗长和复杂的数据结构。为简化起见,它基本上如下所示:
{'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}]}}
更新
非常感谢你们所有出色的答案!我真的学到了很多东西。
答案 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,统计