2014-12-02 4 views
0

Если у меня есть список словарей, есть ли способ обратиться к определенному элементу в декларации цикла цикла?Обратитесь к элементу словаря в цикле 'for'

Что-то вроде этого:

dict_lst = [ 
    {'a': 1, 'b': 2, 'c': 3}, 
    {'a': 1, 'b': 2, 'c': 3}, 
    {'a': 1, 'b': 2, 'c': 3}, 
] 

for d['a'] as dict_elem in dict_lst: 
    print dict_elem 

Или что-то подобное?

ответ

3

Нет, нет asfor положения в отчетности.

Но это довольно легко сделать это явно:

for d in dict_lst: 
    dict_elem = d['a'] 
    print dict_elem 

Или, более просто:

for d in dict_list: 
    print d['a'] 

Или, если вы хотите получить фантазии:

for dict_elem in (d['a'] for d in dict_lst): 
    print dict_elem 

Или, только для развлечения:

for dict_elem in map(operator.itemgetter('a'), dict_lst): 
    print dict_elem 

Что можно завернуть в качестве многоразовой функции:

def itemmap(dicts, key): 
    for item in dicts: 
     yield item[key] 

for dict_elem in itemmap(dict_lst, 'a'): 
    print dict_elem 

В качестве примечания, вы на самом деле можно сделать for d['a'] in dict_list:, но это просто перераспределяет d['a'] (при условии d уже словаря) к каждому новому словарь в списке, что обычно является чем-то непонятным. (Это может быть полезно для запутанного кода конкурсов ...)

+0

Ах прохладно. Я откладывал изучение генераторов на некоторое время - думаю, пришло время узнать о них! – vincent

+1

@ vincent: Это одна из лучших частей официального учебника (см. [List Consrehensions] (https://docs.python.org/2/tutorial/datastructures.html#list-comprehensions), если вы не узнайте их, затем запустите на [Итераторы] (https://docs.python.org/2/tutorial/classes.html#iterators) и прочитайте оставшуюся часть этой главы. Затем, как только у вас есть основы, см. [ Презентация Дэвида Бэйсли] (http://www.dabeaz.com/generators-uk/). – abarnert

2

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

>>> dict_lst = [ 
... {'a': 1, 'b': 2, 'c': 3}, 
... {'a': 1, 'b': 2, 'c': 3}, 
... {'a': 1, 'b': 2, 'c': 3}, 
... ] 
>>> for dict_elem in (d['a'] for d in dict_lst): 
...  dict_elem 
... 
1 
1 
1 
>>> 
0

вы можете использовать это:

for element in dict_lst: 
    print element['some_key'] 
+0

Я думаю, что вы имели в виду 'dict_lst [element]' –

+0

@FarmerJoe Я не заметил – Andres

+0

У вас все еще есть неправильный. Должно быть 'dict_lst [element]'. Когда вы выполняете 'для элемента в some_dictionary: ...', вы повторяете ключи. –

0

Это один из самых быстрых и вещих метод, чтобы сделать это, опереться на Python 3:

for key, val in d.iteritems(): 
    print key, val 

Существует также аналогичный метод items, который делает практически то же самое. items создаст список кортежей с ключом и значением, если вы вызываете его в инструкции цикла for. Существует также аналогичный метод keys, который возвращает только список ключей.

iteritems не будет генерировать список кортежей, когда вы вызываете его в цикле for. Each element will be evaluated in each loop cycle. Таким образом, нет первоначального накладного и расширенного использования памяти. Если вы нарушите цикл, это тоже лучше.

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