2014-12-08 1 views
-2

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

lst1 = {1: {"a": "x","b": "y"}, 2: {"b": "y", "c": "z"}} 

Я хочу, чтобы сделать плоский Dict из него. Любые дублирующиеся ключи должны быть удалены, так что только ключи, уникальные для одного из вложенных dicts, присутствуют в сплющенном dict. ДИКТ выше должно стать:

{"a": "x", "c": "z"} 

простой код будет:

for key, value in lst1.iteritems(): 
    for key1, value1 in value.iteritems(): 
     if key1 <> "b": 
     lst2[key1]=value1 

Я попробовал некоторые из предыдущих ответов here, here и here, но не мог заставить его работать правильно.

Ниже код возвращает ошибку: значение не определено

lst2 = {key1: value1 for key1, value1 in value for key, value in lst1.items()} 

Это одно:

lst2 = dict((key1, value1) for key1, value1 in (value for key, value in lst1.items())) 

возвращается:

{'a': 'b', 'c': 'b'} 

Как я могу сгладить структуру правильно, как я Вы описали?

ответ

1

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

data = {1: {'a': 'x', 'b': 'y'}, 2: {'b': 'y', 'c': 'z'}} 
out = {} 

for sub in data.values(): 
    for key, value in sub.items(): 
     if key in out: 
      del out[key] 
     else: 
      out[key] = value 

print(out) # {'a': 'x', 'c': 'z'} 

Вы также можете сделать это с помощью двух постижений и Counter. Сначала отследите, сколько раз появляется каждый под-ключ, а затем сглаживают только клавиши с одним вхождением.

from collections import Counter 

data = {1: {'a': 'x', 'b': 'y'}, 2: {'b': 'y', 'c': 'z'}} 

c = Counter(key for sub in data.values() for key in sub) 
out = {key: value for sub in data.values() for key, value in sub.items() if c[key] == 1} 

print(out) # {'a': 'x', 'c': 'z'} 
+0

Это было бы просто! Любой другой питонический способ кодирования? !!! – msc87

+0

хорошо, вы правы. Мне просто интересно, можно ли это сделать, используя понимание dict. на первый взгляд я думал, что это возможно, но через несколько часов я сдался и отправил сюда ... никакой выгоды, во всяком случае !!! – msc87

+0

проблема - второе понимание. он возвращает ошибку, когда вы используете .values, иначе второго понимания было бы достаточно, поскольку я уже извлек дублирование, пересекая значения двух dicts. – msc87