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

问题描述:

我有一个需要采取一个整数值和索引到一个相应的字符串表。在这种情况下,连续的整数范围都应该映射到相同的字符串。喜欢的东西(与非工作词典为例):字典与多个键映射到相同的值

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

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

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

+5

这不是字典的定义。字典做平等检查。您可以使用称为*间隔树*的数据结构,它在* O(log n)*中进行查找。 –

+0

@WillemVanOnsem,这是我的原始结论。似乎有办法[使其工作](https://stackoverflow.com/questions/2974022/is-it-possible-to-assign-the-same-value-to-multiple-keys-in-a- dict-object-at-onc#2974082)。我会检查_interval trees_。 – sherrellbc

+2

是的,但是这只会为'range(..)'中的每个元素生成一个关键字,所以如果范围超过数百万个元素,字典将会炸毁。当然,这将工作(给予Python有足够的内存)。 –

是你想要达到的目标吗?

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 
+0

这很有用,但我希望这样做可能会有一些支持的语法。就像使用'range'一样。谢谢回复。 – sherrellbc

+0

@sherrellbc,也许你可以使用元组作为关键?那么你可以检查它是否在 – Tbaki

+0

@sherrellbc检查编辑 – Tbaki

什么嵌套词典?一级密钥位于间隔左侧,二级密钥位于右侧?

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

我不认为这种罕见情况下有特殊的语法。但是你可以创建一个带有一系列键和你想要的值的dict。并将其添加到int_dict使用update

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'}) 

我提议,我觉得更Python的解决方案:首先是与创建具有不同值的键,然后将其与具有键的字典更新字典使用相同的值dict.fromkeys

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