2013-09-16 2 views
1

Извините заранее, если этот вопрос уже рассмотрен здесь - здесь я посмотрел разные ответы, но не смог найти то, что мне нужно.Список значений для дубликатов ключей в словаре Python

Моя цель состоит в том, чтобы создать словарь, как это - {'a':[10, 9, 10, 10], 'b':[10, 9, 1, 0], 'c':[0, 5, 0, 1], and so on}

Что у меня есть несколько словарей с повторяющимися ключами (одни и те же клавиши в любом другом словаре), что-то вроде этого {'a':10, 'b': 0, 'c': 2} {'a':7, 'b': 4, 'c': 4} {'a':4, 'b': 5, 'c': 3}

У меня нет возможности узнать количество таких словарей, или если в них есть ключи, продолжающиеся до «f» или «g», но я знаю, что ключи дублируются. Я попытался defaultdict, но то, что я получаю is--

defaultdict(<type 'list'>, {'a': [10]}) 
defaultdict(<type 'list'>, {'a': [10], 'b': [3]}) 
defaultdict(<type 'list'>, {'a': [10], 'b': [3], 'c': [0]}) 

и то же самое для следующего словаря -

defaultdict(<type 'list'>, {'a': [4]}) 
defaultdict(<type 'list'>, {'a': [4], 'b': [5]}) 
defaultdict(<type 'list'>, {'a': [4], 'b': [5], 'c': [1]}) 

код, который я есть для вышеприведенного выходе -

d = collections.defaultdict(list) 
    for k, v in z.iteritems(): 
     d[k].append(v) 
     c = d.items() 
     print d 

Если я делаю print c вместо (напечатать d.items()) я -

[('a', [10])] 
[('a', [10]), ('b', [3])] 
[('a', [10]), ('c', [0]), ('b', [3])] 

, который снова повторяется для каждого словаря. Как получить 1 Dict держит все ключи, значения -

{'a':[10,0,..], 'b':[4, 3, 4,..], etc.} ? 

Я хотел бы также добавить, что dicts у меня есть результат для цикла и не хранится отдельно в уникальной переменной.

ответ

6

Если я правильно понимаю вашу Attetion, вы пытаетесь объединить различные словари. Один из способов, с помощью встроенных модулей (я уверен, что скоро кто-то даст вам numpy и collections ответ) может выглядеть следующим образом:

ds = [ 
    {'a':10, 'b': 0, 'c': 2}, 
    {'a':7, 'b': 4, 'c': 4}, 
    {'a':4, 'b': 5, 'c': 3} ] 

merged = {} 
for d in ds: 
    for k, v in d.items(): 
     if k not in merged: merged [k] = [] 
     merged [k].append (v) 

print (merged) 

(довольно громоздким для ясности)

EDIT: После прочитав ваш комментарий о том «в результате я хочу это список значений/ключ», вы можете использовать это на результирующий объединенного словаре

print ([ (v, k) for k, v in merged.items() ]) 

это дает:

[([10, 7, 4], 'a'), ([2, 4, 3], 'c'), ([0, 4, 5], 'b')] 
+0

Я думаю, что сами дикторы находятся в отдельных строках. Когда я запускаю ваше решение, я получаю - 'для k, v в d.items(): AttributeError: объект 'str' не имеет атрибутов 'items''. Позвольте мне посмотреть, могу ли я удалить кавычки - d = d [1: -1] не помогает. – user2480526

+0

Возможно ли, что ваш вход JSON? Если да, вы должны использовать модуль 'json' для его чтения. – Hyperboreus

0

Вот один из способов думать об этом:

Учитывая словарь в Python, вы можете получить доступ к value по dictionary[key]. В вашем случае значения словарей являются списками.

Итак, вы можете придумать функцию, чтобы взять ключ, посмотреть, существует ли он в вашем словаре, и если это так, просто добавьте значение в словарь. Например:

Скажите это ваш текущий словарь:

d = { 'a':[3, 17], 'b':[2, 4] } 

и у вас есть эти данные для анализа:

data0 = { 'a':10, 'b':2, 'c':2 } 

Поскольку ключ 'a' уже существует, вы хотите взять значение data0['a'] и добавьте к d по d['a'].append(data0['a']).

Позвольте мне знать, что это помогает/если вам нужно какое-либо уточнение!

  • mikeba
+0

Просто, чтобы быть ясным - в настоящее время у меня есть ряд словарей, каждый из которых имеет уникальное значение/ключ (& not list of values ​​/ key), но с ключами, повторяющимися в каждом другом словаре. В результате я хочу список значений/key. Кроме того, я не знаю, сколько диктонов или ключей есть/словарь. Извините, но не был уверен в формулировке, если ваш soln. это тоже означало. Думаю, я также должен добавить, что dicts, который у меня есть, является результатом цикла for и не сохраняется отдельно в уникальной переменной. – user2480526

+0

yep, это решение, безусловно, будет работать даже в этом случае. Все, что вам нужно запустить: 'if key in dict: dict [key] .append (data0 [key]) else: dict [key] = data0 [key]' – mikeba

1

Это то, что вам нужно?

in_dicts = [{'a':10, 'b': 0, 'c': 2}, {'a':7, 'b': 4, 'c': 4}, {'a':4, 'b': 5, 'c': 3}] 
out_dict = {} 

for in_d in in_dicts: 
    for k, v in in_d.iteritems(): 
    out_dict.setdefault(k, []).append(v) 
print out_dict 

{ 'а': [10, 7, 4], 'с': [2, 4, 3], 'B': [0, 4, 5]}

+0

есть. спасибо. но я получаю 'for k, v in in_d.iteritems(): AttributeError: объект 'str' не имеет атрибута 'iteritems''. Как только я это выясню, мне будет хорошо (я думаю). – user2480526

+0

Я предполагаю, что ваш вход подобен этому ... ["{'a': 10, 'b': 0, ...}", ...]. Итак, словари поступают как строки и должны сначала быть преобразованы в настоящие словари. – jcfollower

+0

см. Http://stackoverflow.com/questions/988228/converting-a-string-to-dictionary – jcfollower

0

Другой способ для этого нужно инициализировать dict, а затем заполнить его уникальными ключами в словарях и их соответствующими значениями без перезаписи существующих значений. шагов: 1. Инициализировать пустой Dict (скажет key_values) для занесения требуется ключ - значения пара 2. Итерации первоначального списка dicts 3. Выход dicts один на один раз 4. Если key еще не был добавлен в key_values dict, добавьте key и добавьте его value к списку; в противном случае добавьте value к значению существующего ключа (который является списком).

list_of_dicts = [{'a':10, 'b': 0, 'c': 2}, {'a':7, 'b': 4, 'c': 4}, {'a':4, 'b': 5, 'c': 3}] 
key_values = {} 

for d in list_of_dicts: 
    for k,v in d.iteritems(): 
     if k in key_values.keys(): 
      key_values[k].append(v) 
     else:  
      key_values[k]=[v] 

print key_values #prints out: {'a': [10, 7, 4], 'c': [2, 4, 3], 'b': [0, 4, 5]}