2016-07-06 1 views
0

중첩 루프를 사용할 때 들여 쓰기를 줄이는 방법이 있습니까?파이썬 중첩 루프를 사용할 때 들여 쓰기 줄이기

for source_i in sources: 
    for source_j in sources: 
     for ni in source_i.nodes: 
      for nj in source_j.nodes: 
       if ni != nj: 
        do_thing(ni, nj) 
+0

'do_thing' 행을'['앞에; 모든 새로운 줄과 콜론을 꺼내십시오. 마지막에']'를 추가하십시오. 빌라! 하지만 그러지 마세요. 목록 내포는 목록을 만드는 쉬운 방법입니다. 'do_thing (...)'의 리턴리스트를 사용하지 않는다면 그것의리스트를 만드는 것은 좋은 생각이 아닙니다. List comprehensions은 목록 작성에 사용되어야하며 부작용이 있어서는 안됩니다. – zondo

답변

2
for source_i in sources: 
    for source_j in sources: 
     pass 

sources 자체의 직교 제품에 쌍을 반복과 같은 일이다.

import itertools 
for (i,j) in itertools.product(sources, repeat=2): 
    pass 

같은 패턴 여기 : 이것은 itertools을 가져 와서 한 줄에 쓸 수있는 당신이 할 수있는 둥지를 이제

for (ni, nj) in itertools.product(i.nodes, j.nodes): 
    pass 

을 :

for ni in i.nodes: 
    for nj in j.nodes: 
     pass 

는 다음과 같이 다시 작성할 수 있습니다

import itertools 
for (i,j) in itertools.product(sources, repeat=2): 
    for (ni, nj) in itertools.product(i.nodes, j.nodes): 
     if ni != nj: 
      do_thing(ni, nj) 
+1

'product (sources, sources)'는'product (sources, repeat = 2)'로 쓰여질 수 있습니다 - 특히 iterable의 2 차원 제품 이상을 원할 때 유용합니다. – plamut

+0

@plamut 예, 저는 그것을 맨 위에두고 그것을 복사하는 것을 잊어 버렸습니다. :) 팁 고마워. – erip

2

예, 중첩 루프를 대체 할 수있는 한 가지 방법은 itertools.product를 사용하는 것입니다 :

(워드 프로세서에서 직접) "입력의 직교 제품은 반복 가능 객체는" product 함수가
from itertools import product 

for source_i, source_j in product(sources, repeat=2): 
    for ni, nj in product(source_i.nodes, source_j.nodes): 
     ... 

.