2013-06-04 2 views
1

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

tr = defaultdict(list) 
tr = { 'critic' : '2_critic', 
'major' : '3_major', 
'all' : ['2_critic','3_major'] 
} 

И второе одно:

scnd_dict = defaultdict(list) 

И содержит значения, как это:

scnd_dict = {'severity': ['all']} 

Я хочу иметь третий дикт, который будет содержать ключ scnd_dict и его соответствие от tr. Таким образом, у меня будет:

third_dict = {'severity' : ['2_critic','3_major']} 

Я попытался это, но он не работает:

for (k,v) in scnd_dict.iteritems() : 
    if v in tr: 
    third_dict[k].append(tr[v]) 

Любая помощь будет оценена. Благодарю.

+0

Ваша ценность во втором dict - это список. Как определить, что «соответствует» ему? – kirelagin

+1

для вашего первого и второго dict, defaultdict переопределяется следующей аффектацией. это базовый dict, а не defaultdict. – njzk2

+0

Спасибо!Я понимаю сейчас – salamey

ответ

1

Ну ...

from collections import defaultdict 

tr = {'critic' : '2_critic', 
     'major' : '3_major', 
     'all' : ['2_critic','3_major']} 

scnd_dict = {'severity': ['all']} 

third_dict = {} 

for k, v in scnd_dict.iteritems(): 
    vals = [] 
    if isinstance(v, list): 
     for i in v: 
      vals.append(tr.get(i)) 
    else: 
     vals.append(tr.get(v)) 
    if not vals: 
     continue 
    third_dict[k] = vals 

print third_dict 

Результаты:

>>> 
{'severity': [['2_critic', '3_major']]} 

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


Если вы используете неоригинальные списки для scnd_dict, то вы можете сделать все это гораздо проще. Предполагая, что scnd_dict выглядит следующим образом: scnd_dict = {'severity': 'all'}:

d = dict((k, tr.get(v)) for k, v in scnd_dict.items()) 
# {'severity': ['2_critic', '3_major']} 
+0

Спасибо за объяснение. Я изменил scnd_dict с defaultdict на dict(), и я использовал ваше простое решение. – salamey

0
third_dict = {k: tr[v[0]] for k, v in scnd_dict.iteritems() if v[0] in tr} 

Этот

tr = defaultdict(list) 

это пустая трата времени, если вы только подменой tr на следующей строке. Аналогично для scnd_dict. Лучше всего сделать все значения tr списков - даже если у них только один элемент. Это будет означать меньше особых случаев, о которых можно будет беспокоиться позже.

+0

Вы пробовали свой код? Я имею в виду ... это не сработает. – kirelagin

+0

v - это список, он не может работать, если tr ключей не являются списками, а это не так. – njzk2

0
third_dict = {k: [t for m in ks for t in tr[m]] for k,ks in scnd_dict.iteritems()} 
1

Ваша проблема заключается в том, что v список, а не элемент списка. Таким образом, if v in tr: будет ложным. Измените свой код так, чтобы вы итерацию по элементам в v

0

значение второго по Dict является список, а не улица, поэтому код удар будет работать

for (k, v) in send_dict.iteritems(): 
    if v[0] in tr.keys(): 
     third_dict[k] = tr[v[0]] 
0

Проблема заключается в том, что третий словарь не знает, что значения - это список

for k in scnd_dict: 
    for v in scnd_dict[k]: 
     print v 
     for k2 in tr: 
      if v==k2: 
       if k not in third_dict: 
        third_dict[k]=tr[k2] 
       else: 
        third_dict[k]+=tr[k2]