由于字典的区分大小写,我有一个字典,其中有很多键彼此不同。我想将它全部放在一个小写的密钥中,但是这些密钥的所有值都会聚合在一起。
我有类似的东西:
>>> 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}
答案 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