2012-05-18 3 views
0

У меня есть словарь в питонеУдаление дубликатов ключей из словаря питона, но суммируя значения

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

себе представить, что это ДИКТ в 10 раз больше, то есть 50 ключей и 50 значений. Дубликаты можно найти в этих тегах, но даже тогда значения необходимы. Как я могу просто обмануть его, чтобы получить новый dict без дубликатов ключей, но с суммой значений вместо этого?

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} 

изменен мой на более явную попытку за исключением обработки. Альфей является очень кратким, хотя

+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

Это на самом деле отлично. То, что я думал, но не мог понять :) –

+1

track = [] для ключа, значение в neop1: \t track.append (ключ) \t результат [ключ] = (result.get (key, 0) + float (value))/track.count (key) # это даст вам среднее значение – 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}) 
Смежные вопросы