获取嵌套Python字典中特定值的计数

2024-10-02 14:30:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个巨大的嵌套字典(6k条记录),我需要根据第二个dict中的两个值进行排序和计数

item_dict = {
    64762.0: {
        'In Sheet': 'No',
        'Paid': Y,
        'Region': "AMER'",
        'Matrix Position': 'Check'
    },
    130301.0: {
        'Paid': N,
        'Region': "AMER'",
        'Matrix Position': 'Calculate'
    },
    13111.0: {
        'In Sheet': 'Yes',
        'Region': "EMEA'",
        'Matrix Position': 'Check'
    },
    130321.0: {
        'Matrix Position': 'Enhance',
        'In Sheet': 'No',
        'Paid': Y,
        'Region': "JP'"
    }
}

所以,我需要得到区域和矩阵位置之间的计数。所以,我会得到:

Amer and Calculate: 1
EMEA and Calculate: 0
EMEA and Check= 1
AMER and Check= 1
EMEA and Enhance= 0
JP and Check=0 

等等。问题是,完整的数据集有5个区域和4个潜在的矩阵位置。最好的方法是使用for循环搜索每个潜在的组合,然后将其添加到自己的列表中吗?你知道吗

AmerCalculate=[]
for row in item_dict:
    if item_dict[row]['Region'] == "AMER'" and item_dict[row]['Matrix Position'] == "Calculate":
        AmerCalculate.append(row)

那么,要得到长度,请进行len(AmerCalculate)计算?有没有一个更优雅的方法,这样我就不必手动键入所有的20个组合?你知道吗


Tags: andincheckpositionitemmatrixregiondict
3条回答

要获得所有组合,可以使用itertools.product。然后可以将结果存储在字典中:

result = {}
for r, p in itertools.product(regions, positions):
    result[(r,p)] = len( [None for item in item_dict.values() if item['Region'] == r and item['Matrix Position'] == p] )

print(result[("AMER", "Calculate")])

使用另一个字典将该数据集耦合在一起,从中可以生成要查找的输出:

def dict_counter(dict_arg):
    d = {'AMER':[],'EMEA':[],'JP':[]}  # Regions as keys.

    for int_key in dict_arg:
        sub_dict = dict_arg[int_key]
        for key, value in sub_dict.items():
            if value in d:
                d[value].append(sub_dict['Matrix Position'])
    return d

样本输出:

>>> item_dict= {12.0: {'In Sheet': 'No', 'Paid': 'Y', 'Region': "AMER",  'Matrix Position': 'Enhance'},1232.0: {'In Sheet': 'No', 'Paid': 'Y', 'Region': "AMER",  'Matrix Position': 'Check'}, 64762.0: {'In Sheet': 'No', 'Paid': 'Y', 'Region': "AMER",  'Matrix Position': 'Check'}, 130301.0: {'Paid': 'N', 'Region': "AMER",  'Matrix Position': 'Calculate'}, 13111.0: {'In Sheet': 'Yes', 'Region': "EMEA",  'Matrix Position': 'Check'}, 130321.0: {'Matrix Position': 'Enhance','In Sheet': 'No', 'Paid': 'Y', 'Region': "JP"}}
>>> print dict_counter(item_dict)
{'JP': ['Enhance'], 'AMER': ['Check', 'Calculate'], 'EMEA': ['Check']}

我们现在有了基础来生成您要查找的报告。我们可以使用Counter来获得所有位置实例的计数。下面是一个如何检查list映射值中的计数的示例。你知道吗

from collections import Counter

d = dict_counter(item_dict)
for k, v in d.items():
    for i, j in Counter(v).items():
        print k,'and',i,'=',j

>>> JP and Enhance = 1
>>> AMER and Enhance = 1
>>> AMER and Check = 2
>>> AMER and Calculate = 1
>>> EMEA and Check = 1
AmerCalculate={}
Regions = ["AMER", "EMEA", "JP"]
Positions = ["Calculate", "Check"]
for row in item_dict():
    for region in regions:
        for pos in Positions:
            if (item_dict[row]['Region']==region) and (item_dict[row][MatrixPosition] == pos:
    AmerCalculate(str(region)+ ' and ' +str(pos) + ":")+=1

这将返回一个字典,其格式如下:{"region + matrixposition:": total}例如 {Amer and Calculate: 1, EMEA and calculate: 1}

你需要归还钥匙吗?或者只是每个地区每个职位的总数?你知道吗

相关问题 更多 >