3

我有一本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}

4

8 回答 8

7

我想改进 Paul Seeb 的回答:

tps = [('cat',5),('dog',9),('cat',4),('parrot',6),('cat',6)]
result = {}
for k, v in tps:
  result[k] = result.get(k, 0) + v
于 2012-05-18T14:39:24.760 回答
5
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})
于 2012-05-18T14:51:56.290 回答
2

我假设您可以将它们放在元组对列表中,而不仅仅是对这些事情进行 dict(在 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}

将我的更改为更明确的 try-except 处理。Alfe's 非常简洁

于 2012-05-18T14:32:42.650 回答
2

这是使用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})
于 2017-05-30T20:11:23.870 回答
1

我不确定你想要实现什么,但 Counter 类可能对你想要做的事情有所帮助:http: //docs.python.org/dev/library/collections.html#collections.Counter

于 2012-05-18T15:12:36.460 回答
1

也许你真正想要的是一个tuple键值对。

[('dog',1), ('cat',2), ('cat',3)]
于 2012-05-18T14:40:49.657 回答
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

于 2014-06-17T16:16:13.463 回答
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
于 2012-05-18T14:37:58.920 回答