Возможно ли, чтобы внутренний язык питона «для» продолжался, где внешний для остановки?

Например, скажем, у меня есть следующий код:

a = [[1],[2],[3]] for c in a: print(c) for d in a: print(d) 

Текущий выход:

 [1] [1] [2] [3] [2] [1] [2] [3] [3] [1] [2] [3] 

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

 [1] [2] [3] [2] [3] [3] 

Другими словами, если это возможно, в «чистом питоне», чтобы внутренний цикл охватывал список из индекса, внешний контур остановился.

Вы можете использовать синтаксис enumerate и списка разрезания ( items[start:end:step] , где start умолчанию – 0, end to items.length и step 1), чтобы выполнить следующее:

 items = [[1], [2], [3]] for i, _ in enumerate(items): for item in items[i:]: print(item) 

Еще одним интересным (хотя и менее эффективным) вариантом было бы использовать itertools.accumulate в сочетании с sum :

 from itertools import accumulate items = [[1], [2], [3]] for item in sum(accumulate(([x] for x in items[::-1])), [])[::-1]: print(item) 

Я бы использовал range и перебирал индексы:

 a = [[1],[2],[3]] for c in range(len(a)): for d in range(c, len(a)): print(a[d]) 

Вы можете использовать list_iterator и при необходимости list_iterator мелкие копии:

 import copy ia = iter(a) for ai in ia: print(ai) for ai in copy.copy(ia): print(ai) # [1] # [2] # [3] # [2] # [3] # [3]