首页 > 解决方案 > 有没有办法避免在字典中重复键值映射?

问题描述

我有一本字典,它将特定时间(从日期中获取)映射到特定数字。

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)

我很乐意得到一些建议。或者在效率方面,最好不要更改字典格式的任何内容?

标签: pythonpython-3.xpandasdictionarykey-value

解决方案


如果您最关心的是代码可读性,您可以像以前一样定义您的 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


推荐阅读