Как превратить список кортежей в словарь при сохранении избыточных значений? - PullRequest
2 голосов
/ 23 марта 2012

Я получаю набор данных, который отформатирован как список пар ключ-значение.Ключ - это источник данных, а значение - элемент данных.Например:

[('a', 3), ('b', 5), ('a', 7), ('c', 15), ('d', 12)]

Я хочу превратить этот список в словарь.Я мог бы использовать встроенный в Python dict(), но он отбрасывает избыточные значения и сохраняет только последнее значение, связанное с данным ключом.Я хотел бы, чтобы избыточные значения вошли в список следующим образом:

{'a': [3, 7],
'b': [5],
'c': [15],
'd': [12]}

Есть ли простой способ сделать это выше?Я думаю, что должно быть, но я не могу найти правильный намек через Google.

Ответы [ 6 ]

14 голосов
/ 23 марта 2012

Вы можете использовать метод словарей setdefault():

d = {}
for key, value in my_list:
    d.setdefault(key, []).append(value)

Это также можно сделать с помощью defaultdict.Какой из этих двух вариантов предпочтительнее, зависит от того, как d используется в остальной части кода.defaultdict никогда не даст вам KeyError, поэтому он может скрывать ошибки ниже в коде.

7 голосов
/ 23 марта 2012

Подкласс dict defaultdict в модуле collections можно использовать для автоматической инициализации нового list для каждого ключа при первом обращении к нему.

С ним вам просто нужноциклически проходить по входным парам и добавлять каждое значение к list соответствующей клавиши, чтобы получить требуемые списки значений.

import collections    

data = [('a', 3), ('b', 5), ('a', 7), ('c', 15), ('d', 12)]
result = collections.defaultdict(list)

for key, value in data:
    result[key].append(value)

print result
defaultdict(<type 'list'>, {'a': [3, 7], 'c': [15], 'b': [5], 'd': [12]})
print result['a']
[3, 7]
print result['z']
[]
3 голосов
/ 23 марта 2012
def multidict(lst):
    result = collections.defaultdict(list)
    for key, value in lst:
        result[key].append(value)
    return result # or dict(result) if you don't want to keep defaultdict
1 голос
/ 23 марта 2012
from collections import defaultdict
l = [('a', 3), ('b', 5), ('a', 7), ('c', 15), ('d', 12)]
d = defaultdict(list)
for k, v in l:
    d[k].append(v)
print d

Смотрите первый пример здесь: http://docs.python.org/release/2.5.2/lib/defaultdict-examples.html

0 голосов
/ 23 марта 2012

как это?

 >>> d=[('a', 3), ('b', 5), ('a', 7), ('c', 15), ('d', 12)]
 >>> f={}
 >>> for k,v in d:
 ...     f[k]=f.get(k,[])+[v]
 ... 
 >>> f
 {'a': [3, 7], 'c': [15], 'b': [5], 'd': [12]}
0 голосов
/ 23 марта 2012

Обе werkzeug и paste предлагают реализации с несколькими вариантами исполнения. Выберите один и используйте его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...