2017-10-20 4 views
1

중첩 루프를 통해 실행중인 일부 코드가 있습니다. 나는 이것을하기위한 더 "파이썬적인"방법이 있다고 추측한다. 어떤 제안?파이썬에서 중첩 된 루프를 반복하는 더 좋은 방법이 있습니까

코드의 기본 섹션은 다음과 같습니다

for e in range(len(listOfTuples)): 

     for item in self.items: 
      if item.getName() == listOfTuples[e][0]: 
       <do stuff> 
      if item.getName() == listOfTyples[e][1]: 
       <do other stuff> 
       continue 

     if <both above if statements got answers>: 
      <do yet more stuff> 

이 중첩 루프를 작성하는 더 좋은 방법이 있나요?

+0

'if' 대신'elif'를 사용할 수 있습니다. –

+0

@Jean'if's는 상호 배타적이지 않습니다. – Blorgbeard

+1

인덱스가 필요 없기 때문에 listOfTuples에서'for for tuple : 할 수 있습니다.'(얕은) 중첩 된 루프에 대해서는 아무 것도 없습니다. – Blorgbeard

답변

0

발전기 기능을 사용할 수 있습니다. 최소한 중첩 된 for 루프의 "추함"을 숨 깁니다.

def combine_items_and_tuples(items, listOfTuples): 
    for e in range(len(listOfTuples)): 
     for item in items: 
      yield e, item 

단순히 그것을 호출이 반복 가능하기 때문에 당신은 또한, 직접 listOfTuples의 반복 수, 이미 코멘트에 언급

for e, item in combine_items_and_tuples(self.items, listOfTuples): 
     if item.getName() == listOfTuples[e][0]: 
       <do stuff> 
     if item.getName() == listOfTyples[e][1]: 
       <do other stuff> 
       continue 

     if <both above if statements got answers>: 
      <do yet more stuff> 

(파이썬 glossary에 봐) :

for tuple in listOfTuples: 
0

으로 반복 직접 listOfTuples을 통해 우리는 약

상관 값을 풀고 0
for a, b, *_ in listOfTuples: 

    a_check, b_check = False, False 

    for item in self.items: 
     if item.name == a: 
      #do stuff 
      a_check = True   
     if item.name == b: 
      #do stuff 
      b_check = True 

    if a_check and b_check: 
     #do more stuff 

*_ (우리는 처음 두 요소입니다 원하는 모든 가정) listOfTuples에서 튜플의 첫 번째 두 요소 과거의 물건을 캡처합니다.

알림 item.getName 대신 item.name을 사용합니다. 개인 변수에 대한 실제 개념이 없기 때문에 파이썬은 일반적으로 getter와 setter를 신경 쓰지 않습니다.