字典与多个键映射到相同的值
我有一个需要采取一个整数值和索引到一个相应的字符串表。在这种情况下,连续的整数范围都应该映射到相同的字符串。喜欢的东西(与非工作词典为例):字典与多个键映射到相同的值
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
这很有用,但我希望这样做可能会有一些支持的语法。就像使用'range'一样。谢谢回复。 – sherrellbc
@sherrellbc,也许你可以使用元组作为关键?那么你可以检查它是否在 – Tbaki
@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"))
这不是字典的定义。字典做平等检查。您可以使用称为*间隔树*的数据结构,它在* O(log n)*中进行查找。 –
@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
是的,但是这只会为'range(..)'中的每个元素生成一个关键字,所以如果范围超过数百万个元素,字典将会炸毁。当然,这将工作(给予Python有足够的内存)。 –