具有多个键映射到相同值的字典

Dictionary with multiple keys mapping to same value

我需要取一个整数值并索引到相应字符串的 table 中。在这种情况下,连续的整数范围应该都映射到同一个字符串。类似的东西(以一个不起作用的字典为例):

int_dict = { 0              : "String1",
             1              : "String2",
             2              : "String3",
             range(3,15)    : "String4",
             16             : "String5"   };

正如预期的那样,在这里使用 range 只是失败,尝试使用列表会给出错误 TypeError: unhashable type: 'list'

也许字典不是完成这项任务的最佳数据结构。那么,我的问题是,这样的事情如何才能轻松完成?范围往往非常大,因此通过手动定义(除非可以使用 range 之类的东西)不是一种选择。

这是你想要达到的吗?

int_dict = { 0              : "String1",
             1              : "String2",
             2              : "String3",
             16             : "String5"   };
#range is first inclusive last exlusif, watch out for that
for i in range(3,15)    :
    int_dict[i] = "String4"

输出:

{0: 'String1',
 1: 'String2',
 2: 'String3',
 3: 'String4',
 4: 'String4',
 5: 'String4',
 6: 'String4',
 7: 'String4',
 8: 'String4',
 9: 'String4',
 10: 'String4',
 11: 'String4',
 12: 'String4',
 13: 'String4',
 14: 'String4',
 16: 'String5'}

编辑:您也可以使用元组作为键

int_dict = { (0,0)              : "String1",
             (1,1)              : "String2",
             (2,2)              : "String3",
              (3,15)             :"String4",
             (16,16)             : "String5"};

def ValueInDict(value):
    for i,j in int_dict.items():
        if value >= i[0]:
            if value <= i[1]:
                print(j)
                return
    print("NOT THERE")

ValueInDict(5)

输出:

 String4

嵌套字典呢?一级键在区间左侧,二级键在区间右侧?

d = {0:{0:"String1"},
...
 3:{15:"String4"},
 16:{16:"String5"}};

我认为这种罕见情况没有特殊的语法。但是您可以创建一个 dict,其中包含一系列键和您想要的值。并使用 update.

添加给你 int_dict
int_dict = { 0              : "String1",
             1              : "String2",
             2              : "String3",
             16             : "String5"   };
int_dict.update(dict([i, "String4"] for i in range(3,16)))

听写理解:

int_dict = {n:'String{}'.format(n+1) for n in range(0,4)}
int_dict.update({n:'String4' for n in range(3,16)})
int_dict.update({16:'String5'})

我提出了一个我觉得更像 pythonic 的解决方案:首先创建一个具有不同值的键的字典,然后使用 dict.fromkeys[=12 使用具有相同值的键的字典更新它=]

int_dict = {
    0: "String1",
    1: "String2",
    2: "String3",
    16: "String5"
}
int_dict.update(dict.fromkeys(range(3,15), "String4"))