学习笔记,有错必纠 反向查找 给定一个字典d,找到键k对应的值v=d[k]非常容易,但是如果我们有值v,而想到键k该咋整呢? 因为可能存在多个键k映射到同一个值v上,所以,我们可以挑
学习笔记,有错必纠
反向查找
给定一个字典d,找到键k对应的值v=d[k]非常容易,但是如果我们有值v,而想到键k该咋整呢?
因为可能存在多个键k映射到同一个值v上,所以,我们可以挑选其中一个键k作为返回值,或者建立一个列表保存所有的键k。
python实现:
def reverse_lookup(d, v):for k in d:
if d[k] == v:
return k
raise LookupError()
d = {'a':1, 'c':2, 'e':2, 'f':1, 't':1}
print(reverse_lookup(d, 2))
输出:
c
反转字典
构造一个反转字典函数,将目标字典中具有相同值的键放在一个列表中,并将其作为新字典的值,新字典的键就是目标字典的值。
python实现:
def invert_dict(d):inverse = dict()
for key in d:
val = d[key]
if val not in inverse:
inverse[val] = [key]
else:
inverse[val].append(key)
return inverse
d = {'a':1, 'c':2, 'e':2, 'f':1, 't':1}
print(invert_dict(d))
输出:
{1: ['a', 'f', 't'], 2: ['c', 'e']}
散列表
我们在之前的BLOG里学过,字典是通过散列表的方式实现的,这意味着键必须是可散列的。
散列是一个函数,接受(任意类型)的值并返回一个整数,字典使用这些被称为散列值的整数来保存和查找键值对。
这套系统当键不可变时,可以正常工作。但是,如果键像列表那样,是可变的话,则会有不好的事情发生。例如,新建一个键值对时,Python将键进行散列并存储到对应的地方,如果修改了作为键的列表,并再次散列,它会指向一个不同的地方。在那种情况下,会导致同一个键有两个条目,或者可能找不到某个键。最终结果,都是导致字典无法正常工作。
因此键必须是可散列的,而类似列表这样的可变类型是不可散列的。同样,因为字典是可变的,它也不能用作键,但可以用作字典的值。