直接计算Python字典中的条件平均值

时间:2015-03-17 15:58:08

标签: python dictionary

我猜测有一种更好的方法来解决Python中的dict,但我不确定如何去做。目前我有一个词典,我正试图找到一个更好的方法来找出公司车主的平均年龄。目前我得到了正确的结果,但我认为我的方法效率低下,因为我会在公司字典中搜索每个NAME密钥,检查公司汽车==为“是”,然后将员工的年龄放入列表中然后,我会在公司结尾处对列表进行平均计算。我确信必须有一个比创建列表和删除值更好的方法吗?

这是关于我的词典的一个例子......

Company{

'NAME1': {''M_or_F': 'Male',
              'AGE’: '24',
             ‘DEPT’: ‘Finance',
      ‘Company Car’:’No’'}

'NAME2': {''M_or_F': 'Male',
              'AGE’: '52',
             ‘DEPT’: ‘Marketing',
      ‘Company Car’:’Yes’'}

'NAME3': {''M_or_F': 'Female',
              'AGE’: '36',
             ‘DEPT’: ‘Finance',
      ‘Company Car’:'Yes''}

'NAME4': {''M_or_F': 'Male',
              'AGE’: '28',
             ‘DEPT’: ‘Finance',
      ‘Company Car’:’No’'}

'NAME5': {''M_or_F': 'Female',
              'AGE’: '23',
             ‘DEPT’: ‘HR',
      ‘Company Car’:’Yes’'}
} 

有关如何取消列表并直接从字典计算的任何提示?

我目前效率低下的方法是......

CC_agelist = []

for NAME in Company:
    if (Company[NAME][‘Company Car'] == 'Yes'):
        CC_agelist.append(int(Company[NAME]['AGE’]))

 #followed by an average calculation on CC_agelist

1 个答案:

答案 0 :(得分:1)

首先,按如下方式清理数据的语法:

Company = {

'NAME1': {'M_or_F': 'Male',
             'AGE': '24',
            'DEPT': 'Finance',
     'Company Car': 'No'},

'NAME2': {'M_or_F': 'Male',
             'AGE': '52',
            'DEPT': 'Marketing',
     'Company Car': 'Yes'},

'NAME3': {'M_or_F': 'Female',
             'AGE': '36',
            'DEPT': 'Finance',
     'Company Car': 'Yes'},

'NAME4': {'M_or_F': 'Male',
             'AGE': '28',
            'DEPT': 'Finance',
     'Company Car': 'No'},

'NAME5': {'M_or_F': 'Female',
             'AGE': '23',
            'DEPT': 'HR',
     'Company Car': 'Yes'}
}

现在您可以使用列表推导来获取列表,然后使用简单的公式来计算平均值:

CC_agelist = [int(D['AGE']) for D in Company.itervalues() if D['Company Car'] == 'Yes']
mean_CC_age = float(sum(CC_agelist)) / len(CC_agelist)

或者您可以导入numpy并在一行上执行所有操作:

import numpy as np
mean_CC_age = np.mean([int(D['AGE']) for D in Company.itervalues() if D['Company Car'] == 'Yes'])