所谓dict的转置也就是key与value对的互换。这里唯一的问题是,Python要求dict中一个key仅能对应一个value而不能对应多个。
因此,如果对于dic = {"a":2, "b":1, "c":2, "d":2, "e":1};这样一个dict,单纯地交互key与value的位置,
>>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被覆盖
{2: 'd', 1: 'e'}
将会出现部分value消失的情况,因为前面存在key对应的value被后面的value所覆盖了。
因此,我们要定义一个数组去存放各个key所对应的value,具体代码如下:
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);
{2: [(0, 0), (0, 2), (0, 3)], 1: [(0, 1), (0, 4), (0, 5)], 3: [(0, 6)], 4: [(0, 7)]}
这里用到一个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长度的数组。代码如下:
>>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);
{1:2,2:3}