具有多个键映射到相同值的字典
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"))
我需要取一个整数值并索引到相应字符串的 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"))