如何统计字典列表中特定键出现次数并追加子项计数
统计字典列表中子项数量并更新名称
问题
需要处理嵌套字典列表,实现两个目标:
- 给每个人员的名称后追加其拥有的动物数量,格式如
Winifred Graham [6] - 给每个地区的名称后追加该地区的总动物数(或总人数),格式如
Satanwi [1]
当前的代码仅能打印人员名称加动物数,无法完成完整需求:
for dico in data: for ele in dico['people']: print(ele['name']+str(len(ele['animals'])))
输入数据 entries:
[ { "name": "Uzuzozne", "people": [ { "name": "Lillie Abbott", "animals": [ { "name": "John Dory" } ] } ] }, { "name": "Satanwi", "people": [ { "name": "Anthony Bruno", "animals": [ { "name": "Oryx" } ] } ] }, { "name": "Dillauti", "people": [ { "name": "Winifred Graham", "animals": [ { "name": "Anoa" }, { "name": "Duck" }, { "name": "Narwhal" }, { "name": "Badger" }, { "name": "Cobra" }, { "name": "Crow" } ] }, { "name": "Blanche Viciani", "animals": [{ "name": "Barbet" }, { "name": "Rhea" }, { "name": "Snakes" }, { "name": "Antelope" }, { "name": "Echidna" }, { "name": "Crow" }, { "name": "Guinea Fowl" }, { "name": "Deer Mouse" }] } ] } ]
期望输出示例:
[ { 'name': 'Dillauti [14]', 'people': [ { 'name': 'Winifred Graham [6]', 'animals': [ { 'name': 'Anoa' }, { 'name': 'Duck' }, { 'name': 'Narwhal' }, { 'name': 'Badger' }, { 'name': 'Cobra' }, { 'name': 'Crow' } ] }, { 'name': 'Blanche Viciani [8]', 'animals': [ { 'name': 'Barbet' }, { 'name': 'Rhea' }, { 'name': 'Snakes' }, { 'name': 'Antelope' }, { 'name': 'Echidna' }, { 'name': 'Crow' }, { 'name': 'Guinea Fowl' }, { 'name': 'Deer Mouse' } ] }, ... ]
解决方案
通过嵌套遍历统计子项数量,直接更新对应名称即可完成需求:
完整代码
def update_names(data): for region in data: total_animals = 0 # 处理每个人员的名称,统计动物数量 for person in region['people']: animal_count = len(person['animals']) person['name'] = f"{person['name']} [{animal_count}]" total_animals += animal_count # 处理地区名称,这里用总动物数,要统计人数就换成 len(region['people']) region['name'] = f"{region['name']} [{total_animals}]" return data # 测试数据 entries = [ { "name": "Uzuzozne", "people": [ { "name": "Lillie Abbott", "animals": [ { "name": "John Dory" } ] } ] }, { "name": "Satanwi", "people": [ { "name": "Anthony Bruno", "animals": [ { "name": "Oryx" } ] } ] }, { "name": "Dillauti", "people": [ { "name": "Winifred Graham", "animals": [ { "name": "Anoa" }, { "name": "Duck" }, { "name": "Narwhal" }, { "name": "Badger" }, { "name": "Cobra" }, { "name": "Crow" } ] }, { "name": "Blanche Viciani", "animals": [{ "name": "Barbet" }, { "name": "Rhea" }, { "name": "Snakes" }, { "name": "Antelope" }, { "name": "Echidna" }, { "name": "Crow" }, { "name": "Guinea Fowl" }, { "name": "Deer Mouse" }] } ] } ] # 执行并格式化输出 import pprint result = update_names(entries) pprint.pprint(result)
代码说明
- 遍历地区:外层循环逐个处理每个地区字典,初始化总动物数计数器。
- 处理人员:内层循环遍历地区下的每个人员,计算其动物数量并更新名称。同时累加该地区的总动物数。
- 更新地区名称:用累加的总动物数更新地区名称,若需要统计人数,只需把
total_animals换成len(region['people'])。 - 格式化输出:用
pprint模块让输出结构更清晰易读。
运行结果
执行后会得到符合要求的结构:
[{'name': 'Uzuzozne [1]', 'people': [{'animals': [{'name': 'John Dory'}], 'name': 'Lillie Abbott [1]'}]}, {'name': 'Satanwi [1]', 'people': [{'animals': [{'name': 'Oryx'}], 'name': 'Anthony Bruno [1]'}]}, {'name': 'Dillauti [14]', 'people': [{'animals': [{'name': 'Anoa'}, {'name': 'Duck'}, {'name': 'Narwhal'}, {'name': 'Badger'}, {'name': 'Cobra'}, {'name': 'Crow'}], 'name': 'Winifred Graham [6]'}, {'animals': [{'name': 'Barbet'}, {'name': 'Rhea'}, {'name': 'Snakes'}, {'name': 'Antelope'}, {'name': 'Echidna'}, {'name': 'Crow'}, {'name': 'Guinea Fowl'}, {'name': 'Deer Mouse'}], 'name': 'Blanche Viciani [8]'}]}]
内容的提问来源于stack exchange,提问作者salim
相关产品推荐
相关产品推荐

