2014-08-04 2 views
0

Есть ли однострочный или Pythonic (я знаю, что первый не обязательно подразумевает последний) способ написать следующий вложенный цикл?Итерация по первой итерации в Python

for i in some_list: 
    for j in i: 
     # do something 

Я попытался

import itertools 
for i,j in itertools.product(some_list,i): 
    # do something 

, но я получаю 'ссылки перед ошибкой назначения', который имеет смысл, я думаю. До сих пор я не смог найти ответ на этот вопрос ... Любые предложения? Благодаря!

+0

Используйте список complehension он будет использовать в качестве Onliner вместо петли в вещем образе. – Nilesh

+1

@ Lafada: вложенные списки не являются питоновскими (их трудно прочитать) ** и ** в любом случае с использованием перечислимых понятий для побочных эффектов, безусловно, неписаных. –

ответ

2

Если вы хотите перебрать каждый подсписок в some_list в своей очереди, вы можете использовать itertools.chain:

for j in itertools.chain(*some_list): 

Короткие дем:

>>> import itertools 
>>> some_list = [[1, 2], [3, 4]] 
>>> for j in itertools.chain(*some_list): 
    print j 


1 
2 
3 
4 

В качестве альтернативы есть chain.from_iterable:

>>> for j in itertools.chain.from_iterable(some_list): 
    print j 


1 
2 
3 
4 

(Помимо f ПЗУ небольшого изменения синтаксиса см this question для объяснения разницы)

+0

Вы имеете в виду, что я все еще могу использовать это для словарей? Я вижу, как это работает для списков списков, но не вижу, как это будет работать для списка словарей. Не могли бы вы показать мне, пожалуйста? – MahatmaCane

+0

Ответ: «Это зависит». Для того, что вы пытаетесь сделать, нет, хотя, если вы просто хотите перебирать значения списка, вы можете сделать 'for j в itertools.chain.from_iterable (map (itemgetter (« some_key »), some_list)): print j '. – jonrsharpe

2

Используйте цепочку:.

import itertools 


some_list = [[1,2,3,4],[3,4,5,6]] 

for i in itertools.chain(*some_list): 
    print i 
1 
2 
3 
4 
3 
4 
5 
6 
Смежные вопросы