所谓dict的转置也就是key与value对的互换。这里唯一的问题是,Python要求dict中一个key仅能对应一个value而不能对应多个。
因此,如果对于dic = {"a":2, "b":1, "c":2, "d":2, "e":1};这样一个dict,单纯地交互key与value的位置,
# -*-coding:utf-8-*- dic = {"a":2, "b":1, "c":2, "d":2, "e":1}; dic_T1 = dict((v, k) for k, v in dic.items()); print dic_T1;
因此,我们要定义一个数组去存放各个key所对应的value,具体代码如下:
# -*-coding:utf-8-*- dic = {"a":2, "b":1, "c":2, "d":2, "e":1}; dic_T = {}; for k, v in dic.items(): dic_T.setdefault(v, []).append(k); print dic_T;
这里用到一个dict自带的setdefault函数,有了这个函数,就不用判断这个名为dic_T新的dict中,某个key值是否已经初始化list,如果不初始化list,单纯append,必然会出现异常,因为list根本不存在。
dict自带的setdefault函数是这样的意思:如果Dict.setdefault(key,value),相当于如果Dict中这个key存在,则等价Dict[key]取出D中k所对应的值value,如果Dict中这个key不存在,则设置Dict[Key]=value。这样的话,在构造这个dic_T,可以省掉一个has_key的判断了,很省事。
上述,就完成一个利用setdefault函数实现dict的转置(key与value对互换)的过程,
当然,这个过程是不可逆的,因为得出来dict的value是一个list,你无法用list作为dict的key,python是这样规定的。
我们可以据此,进一步统计dic中某一value出现的次数。此时利用到上述错误转置方法的循环构造dict的方法,在dic_T的基础上,构造一个key就是原来的key,value则是对应list长度的数组。代码如下:
# -*-coding:utf-8-*- dic = {"a":2, "b":1, "c":2, "d":2, "e":1}; dic_T = {}; for k, v in dic.items(): dic_T.setdefault(v, []).append(k); dic_T = dict((k, len(v)) for k, v in dic_T.items()); print dic_T;