python comples字典理解

时间:2017-02-20 17:57:28

标签: python python-2.7 python-3.x

您好我正在尝试解决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

3 个答案:

答案 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)