2015-03-02 1 views
0
Keys = [1,2,3] 
Values = [["a",1],["b",2],["c",3],["d",1]] 

Dictionary = dict.fromkeys(Keys) 

for d in Dictionary: 
    for value in Values: 
     if value[1] == d: 
      # Add to dictionary 
      Dictionary.update({d:value}) 
     # else 
      # Do Nothing 

print(Dictionary) 

Когда я запускаю этот кусок кода, он отлично работает, пока я не посмотрю ближе к его выходу. Я заметил, что, потому что я хотел бы добавить два «значения» к «Key» 1, он перезаписывает первый добавлен и уходит последним, вот вывод:Python List to Dictionary - Без значения Перезапись

{1: ['d', 1], 2: ['b', 2], 3: ['c', 3]} 

Я хотел бы значения ключ 1 должен быть как ['a',1] И ['d',1].

+0

Итак: '{1: [[ 'а', 1], [ 'd', 1]] , ...} 'тогда? –

+0

Да, это то, что я хотел бы от цикла for – tester

+0

Словарь ключей уникален ... так что нет ... –

ответ

4

Используйте объект defaultdict.

# -*- coding: utf-8 -*- 
from collections import defaultdict 

values = [["a", 1], ["b", 2], ["c", 3], ["d", 1]] 
d = defaultdict(list) 
for x, y in values: 
    d[y].append([x, y]) 

Затем вы можете получить доступ к ключу и значениям как обычный объект dict.

for k, v in d.iteritems(): 
    print "{} {}".format(k,v) 

Какие выходы

1 [['a', 1], ['d', 1]] 
2 [['b', 2]] 
3 [['c', 3]] 
+0

Просто примечание : это создает новый список для каждого элемента и не ссылается на исходный список в «Значениях». Для этого сохраните список и используйте индекс '0' в качестве ключа. –

1

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

from collections import defaultdict 

keys = [1,2,3] 
values = [["a",1],["b",2],["c",3],["d",1]] 

mydict = defaultdict(list) 
for key in keys: 
    mydict[key].extend(value for value in values if value[1] == key) 
1

Что-то вроде этого, вы имели в виду:

my_dict = {i:[] for i in Keys} 

for a, b in Values: 
    my_dict[b].append([a, b]) 

 Смежные вопросы

  • Нет связанных вопросов^_^