2013-07-18 3 views
1

Скажем, у меня есть список dicts или объектов, которые эффективно выглядит следующим образом:Создать список из нескольких атрибутов

[ 
    {'score': 5, 'tally': 6}, 
    {'score': 1, 'tally': None}, 
    {'score': None, 'tally': None}, 
] 

Что бы Pythonic и краткий способ создания списка всех ' оценка и 'tally's которые не являются ни одним? так что результат будет следующий:

[5, 6, 1 ] 

ответ

3

Попробуйте это краткое решение, используя списковые:

lst = [{'score': 5, 'tally': 6}, 
     {'score': 1, 'tally': None}, 
     {'score': None, 'tally': None}] 

[v for m in lst for v in m.values() if v is not None] 
=> [6, 5, 1] 
+0

Это действительно приятно, спасибо! знаете ли вы аналогичный метод, если элементы в списке не являются dicts? т. е. 'score' и' tally' будут атрибутами объекта. – Matt

+1

Это было бы похоже, потому что атрибуты в объекте хранятся в атрибуте '__dict__' объекта –

+0

Мое удовольствие! :-) –

1
list(i for i in 
    itertools.chain.from_iterable(
     itertools.izip_longest(
     (d['score'] for d in listOfDicts if d['score'] is not None), 
     (d['tally'] for d in listOfDicts if d['tally'] is not None) 
    )) if i is not None) 

>>> import itertools 
>>> listOfDicts = [ 
...  {'score': 5, 'tally': 6}, 
...  {'score': 1, 'tally': None}, 
...  {'score': None, 'tally': None}, 
... ] 
>>> list(i for i in itertools.chain.from_iterable(itertools.izip_longest((d['sco 
re'] for d in listOfDicts if d['score'] is not None), (d['tally'] for d in listO 
fDicts if d['tally'] is not None))) if i is not None) 
[5, 6, 1] 
+0

Спасибо, я никогда не знал о 'izip_longest'. Это похоже на то, как мое решение закончилось, у меня просто было чувство, что я упускаю из виду понимание одной строки. – Matt

+1

Да, 'izip_longest' очень пригодится. Проверьте [this] (http://stackoverflow.com/a/11319002/198633) – inspectorG4dget

+1

Спасибо Ashwin :-) – Matt

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