2012-05-18 230 views
0

我有一本字典在python从Python字典中删除重复键,但合计值

d = {tags[0]: value, tags[1]: value, tags[2]: value, tags[3]: value, tags[4]: value} 

想象这是字典大10倍,它有50项和50个值。重复可以在这个标签中找到,但即使这样,值也是必不可少的。我怎样才能简单地修剪它来重新制定新的字典,而不用重复键,而是用值的汇总呢?

d = {'cat': 5, 'dog': 9, 'cat': 4, 'parrot': 6, 'cat': 6}

结果

d = {'cat': 15, 'dog': 9, 'parrot': 6}

+3

你没有那个词典,所有的键都是唯一的。 –

+0

你不能在Python字典中有重复项 – Andy

+0

你应该考虑改变问题的名称,因为字典不能有重复键首先 –

回答

2

而不是仅仅做这些事情的dict(不能有一个字典相同的密钥的倍数),我认为你可以让他们在名单元组对。然后它就像

tps = [('cat',5),('dog',9),('cat',4),('parrot',6),('cat',6)] 
result = {} 
for k,v in tps: 
    try: 
     result[k] += v 
    except KeyError: 
     result[k] = v 

>>> result 
{'dog': 9, 'parrot': 6, 'cat': 15} 

更改我的更明确的尝试除外处理。 ALFE的虽然

+2

为什么不使用'collections.defaultdict'? – Akavall

+1

你为什么要呢?我觉得为了解决这个问题变得复杂化,让这些事情变得简单。阿尔费的答案在这里是明显的选择。我的意思是和他的意思相同 –

+1

我想,仅仅是品味的问题。尽管如此,我会使用'defaultdict'。我更喜欢它的可读性。它也被设计来处理这种情况。 – Akavall

0

此选项供应,但与列表完成,或者最好能提供洞察

data = [] 
     for i, j in query.iteritems(): 
      data.append(int(j))  
     try: 
      data.sort() 
     except TypeError: 
      del data 
     data_array = [] 
     for x in data: 
      if x not in data_array: 
       data_array.append(x) 
     return data_array 
6

我想提高保罗马斯喀特的回答很简洁:

tps = [('cat',5),('dog',9),('cat',4),('parrot',6),('cat',6)] 
result = {} 
for k, v in tps: 
    result[k] = result.get(k, 0) + v 
+0

这实际上是非常好的。 (key)=(result.get(key,0)+ key) –

+1

track = [] key,value in neop1: \t track.append(key) \t result [key] =(result.get(key,0)+ float(value))/ track.count(key)#this会给你平均值 – chimpsarehungry

1

Perhapse什么你真的想要的是一个tuple的键值对。

[('dog',1), ('cat',2), ('cat',3)] 
1
tps = [('cat',5),('dog',9),('cat',4),('parrot',6),('cat',6)] 

from collections import defaultdict 

dicto = defaultdict(int) 

for k,v in tps: 
    dicto[k] += v 

结果:

>>> dicto 
defaultdict(<type 'int'>, {'dog': 9, 'parrot': 6, 'cat': 15}) 
0

如果我正确理解你的问题,你想摆脱重复的关键数据,创建字典时使用字典的更新功能。如果密钥重复,它将覆盖数据。

tps = [('cat',5),('dog',9),('cat',4),('parrot',6),('cat',6)] 
result = {} 
for k, v in tps: 
    result.update({k:v}) 
for k in result: 
    print "%s: %s" % (k, result[k]) 

输出如下: 狗:9 鹦鹉:6 猫:6

0

这对于使用Counter数据结构的完美局面。 让我们看看它在几个熟悉的数据结构上的作用。 让我们从老的名单开始。

>>> from collections import Counter 
>>> list_a = ["A", "A", "B", "C", "C", "A", "D"] 
>>> list_b = ["B", "A", "B", "C", "C", "C", "D"] 
>>> c1 = Counter(list_a) 
>>> c2 = Counter(list_b) 
>>> c1 
Counter({'A': 3, 'C': 2, 'B': 1, 'D': 1}) 
>>> c2 
Counter({'C': 3, 'B': 2, 'A': 1, 'D': 1}) 
>>> c1 - c2 
Counter({'A': 2}) 
>>> c1 + c2 
Counter({'C': 5, 'A': 4, 'B': 3, 'D': 2}) 
>>> c_diff = c1 - c2 
>>> c_diff.update([77, 77, -99, 0, 0, 0]) 
>>> c_diff 
Counter({0: 3, 'A': 2, 77: 2, -99: 1}) 

正如您所看到的,这表现为一个将元素出现次数保持为值的集合。嗯,但是使用字典而不是列表呢?字典本身就是一个类似于集合的结构,对于值我们不需要有数字,那么如何处理呢?让我们来看看。

>>> dic1 = {"A":"a", "B":"b"} 
>>> cd = Counter(dic1) 
>>> cd 
Counter({'B': 'b', 'A': 'a'}) 
>>> cd.update(B='bB123') 
>>> cd 
Counter({'B': 'bbB123', 'A': 'a'}) 


>>> dic2 = {"A":[1,2], "B": ("a", 5)} 
>>> cd2 = Counter(dic2) 
>>> cd2 
Counter({'B': ('a', 5), 'A': [1, 2]}) 
>>> cd2.update(A=[42], B=(2,2)) 
>>> cd2 
Counter({'B': ('a', 5, 2, 2), 'A': [1, 2, 42, 42, 42, 42]}) 
>>> cd2 = Counter(dic2) 
>>> cd2 
Counter({'B': ('a', 5), 'A': [1, 2]}) 
>>> cd2.update(A=[42], B=("new elem",)) 
>>> cd2 
Counter({'B': ('a', 5, 'new elem'), 'A': [1, 2, 42]}) 

正如你可以看到,我们正在增加值/改变必须是同一类型的update或它抛出TypeError。 至于你的具体情况只是顺其自然

>>> d = {'cat': 5, 'dog': 9, 'cat': 4, 'parrot': 6, 'cat': 6} 
>>> cd3 = Counter(d) 
>>> cd3 
Counter({'dog': 9, 'parrot': 6, 'cat': 6}) 
cd3.update(parrot=123) 
cd3 
Counter({'parrot': 129, 'dog': 9, 'cat': 6})