python - 有没有办法避免在字典中重复键值映射?
问题描述
我有一本字典,它将特定时间(从日期中获取)映射到特定数字。
time_of_day_mapping = {
4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0, 10: 0, 11: 0,
12: 1, 13: 1, 14: 1, 15: 1, 16: 1,
17: 2, 18: 2, 19: 2, 20: 2, 21: 2, 22: 2, 23: 2,
0: 3, 1: 3, 2: 3, 3: 3}
令我沮丧的是,某些值映射到相同的值,例如 0、1、2 和 3 映射到 3。我想以某种方式将字典键格式更改为范围或元组以避免以这种方式重复:
time_of_day_mapping = {
range(4, 12): 0,
range(12, 17): 1,
range(17, 24): 2,
range(0, 4): 3}
但是,如果我只有一个这样的值,我不确定如何使用范围作为键有效地获取映射:
df['some_date'].apply(lambda x: time_of_day_mapping.get(x.hour)
我很乐意得到一些建议。或者在效率方面,最好不要更改字典格式的任何内容?
解决方案
如果您最关心的是代码可读性,您可以像以前一样定义您的 dict,然后将其“解包”为原始形式(这样您就可以进行常规字典查找):
time_of_day_mapping = {
range(4, 12): 0,
range(12, 17): 1,
range(17, 24): 2,
range(0, 4): 3
}
time_of_day_mapping = dict((key, value) for range_obj, value in time_of_day_mapping.items() for key in list(range_obj))
print(time_of_day_mapping)
运行此代码后,time_of_day_mapping
它正是您的问题中首次出现的字典。
让我建议,为了提高可读性,你使用包容性的起始元组作为键,然后range
在理解中使用它们,如下所示:
time_of_day_mapping = {
(4, 11): 0,
(12, 16): 1,
(17, 23): 2,
(0, 3): 3
}
time_of_day_mapping = dict((key, value) for (start, end), value in time_of_day_mapping.items() for key in list(range(start, end+1)))
print(time_of_day_mapping)
我认为最好是看到(4,11):0
而不是(4,12):0
何时d[12] != 0
。
推荐阅读
- unix - 如何删除文件中某些行中的特定字符?
- php - 在对 2 个或多个整数执行加法时获取所有进位数字的总和
- php - 预期类型“可迭代|对象”。找到“字符串”但不明白为什么
- python - 如何编辑此代码以便输入 GIF 文件?它允许我使用 JPG 和 PNG,但不能使用 GIF
- ios - Swift UI 列表未在 Cloudkit 同步时更新
- php - PHP Server 在 Heroku 的 json 中返回错误
- java - 为 MediaStore.createTrashRequest 函数创建 Uri
- python - Binance API:APIError(code=-1111):精度超过了为该资产定义的最大值。|| Python
- kubernetes - AlertmanagerConfig CRD 配置以允许发送电子邮件
- css - 如何摆脱镀铬淋浴喷头/画笔/它添加到表单字段的任何图标?