python - 如何在不包含类/类型的情况下打印嵌套的 defaultdict?
问题描述
我有以下代码:
from collections import defaultdict
db1 = {'Adam': {'Cleaning': 4, 'Tutoring': 2, 'Baking': 1},
'Betty': {'Gardening': 2, 'Tutoring': 1, 'Cleaning': 3},
'Charles': {'Plumbing': 2, 'Cleaning': 5},
'Diane': {'Laundry': 2, 'Cleaning': 4, 'Gardening': 3}}
def by_skill(db1 : {str:{str:int}}) -> [int,[str,[str]]]:
order_skills = defaultdict(lambda:defaultdict(list))
for k,v in db1.items():
for key,value in v.items():
order_skills[value][key].append(k)
dict(order_skills)
order_skills_sorted = sorted( sorted(order_skills.items()), reverse=True )
return order_skills_sorted
if __name__ == '__main__':
print(by_skill(db1))
输出:
[(5, defaultdict(<class 'list'>, {'Cleaning': ['Charles']})), (4, defaultdict(<class 'list'>, {'Cleaning': ['Adam', 'Diane']})), (3, defaultdict(<class 'list'>, {'Cleaning': ['Betty'], 'Gardening': ['Diane']})), (2, defaultdict(<class 'list'>, {'Tutoring': ['Adam'], 'Gardening': ['Betty'], 'Plumbing': ['Charles'], 'Laundry': ['Diane']})), (1, defaultdict(<class 'list'>, {'Baking': ['Adam'], 'Tutoring': ['Betty']}))]
但我需要输出(格式化为可读性,不是要求):(按字母顺序)
[(5, [('Cleaning', ['Charles'])]),
(4, [('Cleaning', ['Adam', 'Diane'])]),
(3, [('Cleaning', ['Betty']), ('Gardening', ['Diane'])]),
(2, [('Gardening', ['Betty']), ('Laundry', ['Diane']),
('Plumbing', ['Charles']), ('Tutoring', ['Adam'])]),
(1, [('Baking', ['Adam']), ('Tutoring', ['Betty'])])]
我是否必须第三次调用 sorted 才能实现这一目标?
解决方案
由于评分的范围在 1 到 5 之间,因此您可以构建名称列表的技能键字典的评分键字典,然后遍历评分以在线性时间内按技能提取名称:
by_skill = {}
for name, skills in db1.items():
for skill, rating in skills.items():
by_skill.setdefault(rating, {}).setdefault(skill, []).append(name)
print([
(
rating,
sorted(
(skill, sorted(names)) for skill, names in by_skill.get(rating, {}).items()
)
)
for rating in range(5, 0, -1)
])
这输出:
[(5, [('Cleaning', ['Charles'])]), (4, [('Cleaning', ['Adam', 'Diane'])]), (3, [('Cleaning', ['Betty']), ('Gardening', ['Diane'])]), (2, [('Gardening', ['Betty']), ('Laundry', ['Diane']), ('Plumbing', ['Charles']), ('Tutoring', ['Adam'])]), (1, [('Baking', ['Adam']), ('Tutoring', ['Betty'])])]
推荐阅读
- python - 让方法返回“自我”以链接方法调用是否很好?
- mysql - 如何使用 EntityManager 为 MySql JSON_EXTRACT 函数创建 JPQL 查询
- html - Flexbox - 如何自动跳转到下一列?
- java - 传递和返回没有“new”关键字的类对象
- python - 如果谷歌云断开连接,如何恢复 anaconda 环境
- svg - 将地理坐标点投影到 SVG 生成的地图中
- spring - 如何使用 Spring vs JavaFx 在 fxml 文件中实现 ToggleGroup
- laravel - 了解 Laravel 中的路由
- html - flexbox justify-content 多个标签在彼此下方
- dart - DartPad 不支持 ON 子句