python - 识别字典列表中特定键的相同值
问题描述
我有一个看起来像这样的字典列表:
[
{'ServiceID': 20, 'primary': '20', 'secondary': '12'},
{'ServiceID': 20, 'primary': '20', 'secondary': '12'},
{'ServiceID': 20, 'primary': '20', 'secondary': '12'},
{'ServiceID': 16, 'primary': '16', 'secondary': '8'},
{'ServiceID': 20, 'primary': '20', 'secondary': '12'},
{'ServiceID': 8, 'primary': '8', 'secondary': '16'},
{'ServiceID': 12, 'primary': '12', 'secondary': '20'},
{'ServiceID': 8, 'primary': '8', 'secondary': '16'}
]
我想创建一个新的排序字典,其中我们有以下内容:
key = value of 'ServiceID'
key = value of how many times that particular 'ServiceID' is listed as a 'primary'
key = value of how many times that particular 'ServiceID' is listed as a 'secondary'
例如:
[
{'ServiceID': 8, 'primaryCount': 2, 'secondaryCount': 1},
{'ServiceID': 12, 'primaryCount': 1, 'secondaryCount': 4},
{'ServiceID': 16, 'primaryCount': 1, 'secondaryCount': 2},
{'ServiceID': 120, 'primaryCount': 4, 'secondaryCount': 1}
]
到目前为止,我所拥有的代码似乎并没有达到我想要的效果,这意味着我不确定如何在整个 for 循环中适当地增加初级和次级的数量,以及如何确保我正在捕获'ServiceID' 的唯一性
我认为我的逻辑有问题:
temp_count_list = list()
temp_primary_counts = 0
temp_secondary_counts = 0
for sub_dict in new_list:
temp_dict = dict()
temp_dict['ServiceID'] = sub_dict['ServiceID']
if sub_dict['ServiceID'] == int(sub_dict['primarySlice']):
temp_dict['primaryCount'] = temp_primary_counts +=1
if sub_dict['ServiceID'] == int(sub_dict['secondarySlice']):
temp_dict['secondaryCount'] = temp_secondary_counts +=1
temp_count_list.append(temp_dict)
解决方案
基本思想是,在一个dict(在代码k中)中获取所有的ServiceID、primary、secondary,然后为每个唯一的ServiceID计算该ServiceID在primary和secondary中的频率。
l = [
{'ServiceID': 20, 'primary': '20', 'secondary': '12'},
{'ServiceID': 20, 'primary': '20', 'secondary': '12'},
{'ServiceID': 20, 'primary': '20', 'secondary': '12'},
{'ServiceID': 16, 'primary': '16', 'secondary': '8'},
{'ServiceID': 20, 'primary': '20', 'secondary': '12'},
{'ServiceID': 8, 'primary': '8', 'secondary': '16'},
{'ServiceID': 12, 'primary': '12', 'secondary': '20'},
{'ServiceID': 8, 'primary': '8', 'secondary': '16'}
]
k = {'ServiceID': [], 'primaryCount': [], 'secondaryCount': []}
for i in l:
k['ServiceID'].append(i['ServiceID'])
k['primaryCount'].append(i['primary'])
k['secondaryCount'].append(i['secondary'])
res = {'ServiceID': 0, 'primaryCount': [], 'secondaryCount': []}
result = []
for i in sorted(set(k['ServiceID'])):
res['ServiceID']=i
res['primaryCount'] = k['primaryCount' ].count(str(i))
res['secondaryCount'] = k['secondaryCount' ].count(str(i))
result.append(res)
res = {'ServiceID': 0, 'primaryCount': [], 'secondaryCount': []}
print(result)
输出
[
{'ServiceID': 8, 'primaryCount': 2, 'secondaryCount': 1},
{'ServiceID': 12, 'primaryCount': 1, 'secondaryCount': 4},
{'ServiceID': 16, 'primaryCount': 1, 'secondaryCount': 2},
{'ServiceID': 20, 'primaryCount': 4, 'secondaryCount': 1}
]
推荐阅读
- flutter - Flutter - 防止用户将应用程序置于后台并防止在 Flutter Web 上打开其他选项卡
- r - 将字符串合二为一
- python - 如何在 django ORM 中仅获取特定记录的值(通过忽略过滤条件)
- node.js - 如何使用 Multer 将文件上传到两个不同的目录?
- design-patterns - 如何自动将 aws(可以是任何云)提供商详细信息添加到 terragrunt.hcl
- sql - 我想获得 pyspark 中平均评分最高的语言
- typescript - 这意味着什么?:在他的示例代码中?
- haskell - 在 Haskell 中实现优先攀登
- php - ttf(字体)文件未使用 Codeigniter 3 上传
- jquery - jQuery AJAX 循环点击事件