2016-12-20 1 views
3

Скажем, у меня есть Dict из dicts:Можно ли создать список всех ключей-членов из dicts dicts, используя понимание списка?

foo = { 
    'category': { 
     'key1': 'bar', 
     'key2': 'bar', 
     'key3': 'bar', 
    }, 
    'category2': { 
     'key4': 'bar', 
     'key5': 'bar', 
    }, 
} 

Чтобы получить единый список всех ключей в странах-dicts, у меня есть функция следующим образом:

def _make_list(): 
    baz = list() 
    for key,val in foo.items(): 
     baz += list(val.keys()) 
    return baz 

Сформированный список выглядит : ['key1', 'key2', 'key3', 'key4', 'key5', ].

Это достаточно просто, и это работает, но мне интересно: есть ли способ сделать это с пониманием списка с одним слоем? Ключи участников dicts всегда будут уникальными.

+1

Btw ваш '+ = лист (..)' должен быть действительно '.extend (...)' ' –

+0

И .items()' не является необходимым, если вы только с помощью значения; '.values ​​()' достаточно. – SethMMorton

+1

Вам действительно нужен список всех ключей, включая дубликаты? Если не набор может быть более уместным: 'set (itertools.chain (* foo.values ​​()))' на основе ответа ettanany. – Duncan

ответ

12

Вот один из способов сделать это:

>>> [k for d in foo.values() for k in d] 
['key1', 'key2', 'key3', 'key4', 'key5'] 
+0

Большое спасибо за ваш ответ! Я отметил это как принятое, так как это именно то, что я искал. Не могли бы вы объяснить, как это работает? – Bryson

3

подход будет использовать itertools.chain():

import itertools 

[k for k in itertools.chain(*(d.keys() for d in foo.values()))] 

Если то, что вы хотите, это просто одна строка кода, а не обязательно список понимание вы можете также попробовать (упомянутые @Duncan):

list(itertools.chain(*foo.values())) 

Выход:

>>> [k for k in itertools.chain(*(d.keys() for d in foo.values()))] 
['key3', 'key2', 'key1', 'key5', 'key4'] 
>>> 
>>> list(itertools.chain(*foo.values())) 
['key3', 'key2', 'key1', 'key5', 'key4'] 
+1

'[k для k in ...]' обычно лучше писать как «list (...)», также 'd.keys()' может быть просто 'd' здесь и' (d для d in. ..) 'также может быть скомпонован, давая' list (itertools.chain (* foo.values ​​())) – Duncan

+0

@ Duncan Я согласен с вами, просто хочу использовать понимание списка, потому что OP просил об этом. Я отредактировал этот ответ, чтобы добавить ваше замечание! – ettanany

+1

Сегодня я узнал, как использовать цепочку itertools. У меня был метод для этого, но он не так чист. Я также использовал chain.fromiterable() в моем. –

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

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