所谓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;
将会出现如下部分value消失的情况,因为前面存在key对应的value被后面的value所覆盖了。
因此,我们要定义一个数组去存放各个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;
运行结果: