通过聚合键使Python字典不区分大小写

时间:2017-01-31 18:29:07

标签: python dictionary case-insensitive

由于字典的区分大小写,我有一个字典,其中有很多键彼此不同。我想将它全部放在一个小写的密钥中,但是这些密钥的所有值都会聚合在一起。

我有类似的东西:

>>> data
{'Blue Car': 73, 'blue Car': 21, 'yellow car': 10, 'Yellow Car': 15, 'Red Car': 12, 'Red car': 17, 'red car': 10, 'Yellow car': 18}

输出应该是:

>>> newData
{'blue car': 94, 'yellow car': 43, 'red car': 39}

5 个答案:

答案 0 :(得分:2)

使用defaultdict:

from collections import defaultdict

newData = defaultdict(int)

for k in data:
    newData[k.lower()]+=data.get(k,0)

# {'blue car': 94, 'red car': 39, 'yellow car': 43}

我希望这会有所帮助。

答案 1 :(得分:1)

如何使用defaultdict

from collections import defaultdict
newData = defaultdict(int)
for k,v in data.iteritems():
    newData[k.lower()] += v

答案 2 :(得分:1)

试试这个

def compress(data):
    newDict = dict()
    for key in data:
        newDict[key.lower()] = newDict.get(key.lower(), default=0) + data[key]
    return newDict

答案 3 :(得分:1)

使用词典和设置理解:

>>> {x: sum(v for k, v in data.items() if k.lower()==x) for x in set(map(lambda x: x.lower(), data))}
{'red car': 39, 'blue car': 94, 'yellow car': 43}

或更友好的用户:

SET = set(map(lambda x: x.lower(), data))
SUM = lambda x: sum(v for k, v in data.items() if k.lower()==x)
newData = {x: SUM(x) for x in SET}

# newData = {'red car': 39, 'blue car': 94, 'yellow car': 43}

解释

SET = set(map(lambda x: x.lower(), data))

获取所有唯一的小写键,

SUM = lambda x: sum(v for k, v in data.items() if k.lower()==x)

返回匹配唯一键的data中的键值和

{x: SUM(x) for x in SET}
对于集合中的每个键,

将此值作为配对的一部分与匹配键匹配。

答案 4 :(得分:1)

我会继承dict并覆盖__getitem____setitem__魔术方法

class NormalizedDict(dict):
    def __getitem__(self,key):
        return dict.__getitem__(self,key.lower())
    def __setitem__(self,key,value):
        return dict.__setitem__(self,key.lower(),value)

myDict = NormalizedDict()
myDict['aPPles'] =5
print myDict
粗略的,我们可以进一步和autosum为你

class NormalizedSumDict(NormalizedDict):
    def __setitem__(self,key,value):
        if key.lower() in self and type(self[key]) == type(value):
           try:
              value = value + self[key]
           except:
              pass
        NormalizedDict.__setitem__(self,key,value)
    def update(self,other):
        for k,v in other.items():
            self[k] = v

d = NormalizedSumDict()
d['aPPles']=5
d['Apples']=2
print d