代码之家  ›  专栏  ›  技术社区  ›  Ildar Akhmetov

一种“查询”字典的蟒蛇式方法

  •  2
  • Ildar Akhmetov  · 技术社区  · 6 年前

    我有一个嵌套字典,其中包含有关书籍的数据:

    • UID
    • 条件
    • 价格

    定义如下:

    books = {
        'uid1':
            {'price': '100',
            'condition': 'good'},
        'uid2':
            {'price': '80',
            'condition': 'fair'},
        'uid3':
            {'price': '150',
            'condition': 'excellent'},
        'uid4':
            {'price': '70',
            'condition': 'fair'},
        'uid5':
            {'price': '180',
            'condition': 'excellent'},
        'uid6':
            {'price': '60',
            'condition': 'fair'}
        }
    

    我需要得到平均价格,按条件分组。因此,预期结果是:

    {'fair': 70, 'good': 100, 'excellent': 165}
    

    做这件事最要紧的方法是什么?

    4 回复  |  直到 6 年前
        1
  •  2
  •   V Sree Harissh    6 年前

    我想用熊猫图书馆回答这个问题。

    import pandas as pd
    books = {
        'uid1':
            {'price': '100',
            'condition': 'good'},
        'uid2':
            {'price': '80',
            'condition': 'fair'},
        'uid3':
            {'price': '150',
            'condition': 'excellent'},
        'uid4':
            {'price': '70',
            'condition': 'fair'},
        'uid5':
            {'price': '180',
            'condition': 'excellent'},
        'uid6':
            {'price': '60',
            'condition': 'fair'}
       }
    data = pd.DataFrame.from_dict(books, orient='index')
    data['price'] = data[['price']].apply(pd.to_numeric)
    data.groupby(['condition'])['price'].mean()
    

    输出:

    condition
    excellent    165
    fair          70
    good         100
    
        2
  •  3
  •   Rakesh    6 年前

    使用 collections.defaultdict

    演示:

    from collections import defaultdict
    
    res = defaultdict(list)
    for k,v in books.items():
        res[v['condition']].append(int(v['price'])) 
    
    print({k: sum(v)/len(v) for k, v in res.items() })
    

    输出:

    {'good': 100, 'fair': 70, 'excellent': 165}
    
        3
  •  2
  •   John Coleman    6 年前

    以下是一种方法:

    from statistics import mean
    result = {condition: mean(float(book['price']) for book in books.values() if book['condition'] == condition) for condition in ('fair','good','excellent')}
    
    #result = {'fair': 70.0, 'good': 100.0, 'excellent': 165.0}
    
        4
  •  2
  •   Sushant    6 年前

    我不明白你为什么需要 defaultdict 除了不使用 Try Except -

    for k, v in books.items():
        try:
            avg[v['condition']].append(int(v['price']))
        except KeyError:
            avg[v['condition']] = [int(v['price'])]
    avg = {k: sum(v)/len(v) for k, v in avg.items()}