您好我正在尝试解决dict并根据成功打印值 如果"成功的价值"为真,而不是加1,否则为0。 对于ex:字典是
info = {'data': {'sample1': {'item': 'fruit1',
'id': 1,
'results': {'Apple': [{
'start_ts': 1487579550,
'success': True}],
'Mango': [{
'start_ts': 1487579550,
'success': True}]
}
},
'sample2': {'item': 'fruit1',
'id': 2,
'results': {'Apple': [{
'start_ts': 1487579550,
'success': True}],
'Mango': [{
'start_ts': 1487579550,
'success': False}]
}
},
'sample3': {'item': 'fruit2',
'id': 3,
'results': {'Apple': [{
'start_ts': 1487579550,
'success': True}],
'Mango': [{
'start_ts': 1487579550,
'success': False}]
}
}
}}
输出应该基于" fruit1"的所有项目的成功。和fruit2,需要增加。
输出:
Apple Mango
fruit1 2 1
fruit2 1 0
迭代这个复杂字典的最佳方法是什么。 我正在尝试一些基本代码:
for k, v in info.items():
for i,sample in v.items():
pprint.pprint(sample['results']) # Prints diction of Apples and Mango
答案 0 :(得分:0)
嗯,就像非常简单的第一种方法一样,你可以这样做:
fruit1 = {'Apple': 0, 'Mango': 0}
fruit2 = {'Apple': 0, 'Mango': 0}
for k, v in info['data'].items():
if v['item'] == 'fruit1':
if v['results']['Apple'][0]['success']:
fruit1['Apple'] += 1
if v['results']['Mango'][0]['success']:
fruit1['Mango'] += 1
if v['item'] == 'fruit2':
if v['results']['Apple'][0]['success']:
fruit2['Apple'] += 1
if v['results']['Mango'][0]['success']:
fruit2['Mango'] += 1
print 'fruit1: {}'.format(fruit1)
print 'fruit2: {}'.format(fruit2)
输出:
fruit1: {'Mango': 1, 'Apple': 2}
fruit2: {'Mango': 0, 'Apple': 1}
只有总是水果的名称相同(fruit1和2),这些都是Apple和Mango。但最好的是,这不重要,您可以从这里开始实现您的领域目标。这有点脏,当然不是最佳解决方案。
答案 1 :(得分:0)
有很多方法可以获得您想要的信息,例如
result={}
for sample in info["data"].values():
name = sample["item"]
inner = result.setdefault(name,{})
for fruit, value in sample["results"].items():
if value[0]["success"]:
inner[fruit] = inner.get(fruit,0) + 1
print(result)
说明:首先我们决定如何获得结果,在这种情况下我选择了一个字典,其中的键是“fruit1”,“fruit2”等,它们的值将是另一个字典,其数量为“Apple”,里面发现了“芒果”等。
然后我们开始迭代关键“数据”的值,因为那是具有我们想要的信息的那个,然后使用setdefault
我们首先为相应名称的值设置初始空内部字典并获取它在inner
变量中,然后我们依次迭代相应结果的项目(也就是水果)并使用get
计算成功次数,这样我们第一次得到0计数
输出
{'fruit1': {'Apple': 2, 'Mango': 1}, 'fruit2': {'Apple': 1}}
一旦你到达那里,你就到了这里,你可以用你想要的任何方式打印它
这是使用生成器表达式和collections模块
的相同变体from pprint import pprint
from collections import Counter, defaultdict
compact = ( (s["item"],( k for k,v in s["results"].items() if v[0]["success"] ) ) for s in info["data"].values())
result = defaultdict(Counter)
for k,v in compact:
result[k].update(v)
pprint(result)
输出
defaultdict(<class 'collections.Counter'>,
{'fruit1': Counter({'Apple': 2, 'Mango': 1}),
'fruit2': Counter({'Apple': 1})})
答案 2 :(得分:0)
使用pandas的简短解决方案,因为嵌套字典是表的一个很好的条目:
pan=pd.Panel.from_dict(info['data'])
def repl(s): return s['item'] if ~isnan(s.id) and s.results[0]['success'] else None
df=pan.apply(repl,'minor')
sta=df.stack().reset_index()
cnt=sta.groupby(['level_0',0]).count().unstack().fillna(0).astype(int)
最终结果(cnt
):
fruit1 fruit2
Apple 2 1
Mango 1 0
详细信息:
pan=pd.Panel.from_dict(info['data'])
然后全部自动进行3D组织:
<class 'pandas.core.panel.Panel'>
Dimensions: 3 (items) x 2 (major_axis) x 3 (minor_axis)
Items axis: sample1 to sample3
Major_axis axis: Apple to Mango
Minor_axis axis: id to results
现在定义一个函数来选择好的水果并减少到2D:
def repl(s): return s['item'] if ~isnan(s.id) and s.results[0]['success'] else None
df=pan.apply(repl,'minor')
for:
sample1 sample2 sample3
Apple fruit1 fruit1 fruit2
Mango fruit1 None None
最后在1D重新组织:
sta=df.stack().reset_index()
None
值被删除:
level_0 level_1 0
0 Apple sample1 fruit1
1 Apple sample2 fruit1
2 Apple sample3 fruit2
3 Mango sample1 fruit1
并且数:
cnt=sta.groupby(['level_0',0]).count().unstack().fillna(0).astype(int)