2014-01-02 2 views
5

У меня есть список полей в формесписок новообращенный из dicts в список

fields = [{'name':'count', 'label':'Count'},{'name':'type', 'label':'Type'}] 

Я хотел бы извлечь только имена и поместить его в список. В настоящее время я делаю это:

names = [] 
for field in fields: 
    names.append(field['name']) 

Есть еще один способ сделать то же самое, что не предполагает пробегает по списку.

Я использую python 2.7.

Благодарим за помощь.!

ответ

8

Вы можете использовать список понимание:

>>> fields = [{'name':'count', 'label':'Count'},{'name':'type', 'label':'Type'}] 
>>> [f['name'] for f in fields] 
['count', 'type'] 
+0

это не добавляет к 'names' –

+0

Создает необходимый список. Я предлагаю такое же решение. –

+0

@BleedingFingers 'names = [f ['name'] для f в полях]' – Hyperboreus

1

names = [x['name'] for x in fields] сделаю.

и если список names уже существует, то:

names += [x['name'] for x in fields] 
+1

'map (names.append, [x ['name'] для x в полях])' очень унииоматично. В Python 2, который использует OP, он создает и затем удаляет пустой список, а в Python 3 он ничего не делает. – DSM

+0

'names + = [x ['name'] для x в полях]' ... – Hyperboreus

5

Взгляните на list comprehensions

Может попробовать:

names = [x['name'] for x in fields] 

Пример:

>>> fields = [{'name':'count', 'label':'Count'},{'name':'type', 'label':'Type'}] 
>>> [x['name'] for x in fields] 
['count', 'type'] 

Если names уже существует Вы можете map (создавая его в том же порядке), чтобы добавить каждый элемент нового списка вы создали:

map(names.append, [x['name'] for x in fields]) 

Пример :

>>> a = [1, 2 ,3] 
>>> map(a.append, [2 ,3, 4]) 
[None, None, None] 
>>> a 
[1, 2, 3, 2, 3, 4] 

Редактировать:

Не знаю, почему я не упомянул list.extend, но вот пример:

names.extend([x['name'] for x in fields]) 

или просто использовать + оператор:

names += [x['name'] for x in fields] 

вы можете также фильтровать " на лету ", используя заявление if, как и следовало ожидать:

names = [x['name'] for x in fields if x and x['name'][0] == 'a'] 

Пример:

>>> l1 = ({'a':None}, None, {'a': 'aasd'}) 
>>> [x['a'] for x in l1 if (x and x['a'] and x['a'][0] == 'a')] 
['aasd'] 

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

0

Если форма определена корректно, значит, «имя» должно быть определено в каждый ДИКТ, то вы можете использовать:

map(lambda x: x['name'], fields) 

еще, вы можете использовать filter перед извлечением, просто чтобы убедиться, что вы не получите KeyError

map(lambda x: x['name'], filter(lambda x: x.has_key('name'), fields)) 
Смежные вопросы