2017-03-15 1 views
1

나는 C++과 Java로 얼마 동안 코딩 해왔다. 나는 파이썬에서 최근에 코드를 작성하기 시작했다. 그러나, 파이썬에서 중첩 된 for 루프의 경우에 막혔다. 다음 코드는 C++로 작성했습니다. 파이썬에서 이와 동등한 코드는 무엇이 될까요?파이썬에서 루프 표현을 위해 중첩 된 C++

for(int i = 0; i<a.size();i++){ 
    for(int j = i; j<a.size();j++) 
    { 
     if a[i] != a[j] 
      /*some code */ 
    } 

} 나는 다음과 같이 열거 사용하려고

하지만 실패

for i, val in enumerate(lst): 
    for j=i,val2 in enumerate(lst): 
     if val != val2 
      #some code 

그래서 어떻게 파이썬에서 C++ 중첩 루프를 나타낼 수 있습니까?

답변

4
import itertools 

for val1, val2 in itertools.combinations(lst, 2): 
    if val1 != val2: 

combinations 반복됩니다. 두 번째 중첩 된 for 루프는 j=i으로 초기화되지만 첫 번째 대/소문자는 조건부를 통과하지 않으므로 항상 처리되지 않습니다.

당신은 정말, 정말 인덱스를해야하고, 일반적으로, 당신은 할 수 안된다 경우 다른 곳에서 언급 한 바와 같이

for (i, val1), (j, val2) in itertools.combinations(enumerate(lst), 2): 
    if val1 != val2: 
+0

감사를 코멘트 : 당신이 열거를 사용하고자하는 경우, 하나의 옵션이 올바르게 번호 인덱스를 시작하는 데 전체 목록 대신 목록 슬라이스를 통과하고 start= 키워드 인수를 사용하는 것입니다. 두 번째 for 루프의 조건이 j = i + 1 인 경우 어떻게됩니까?이 경우 itertool은 어떻게 작동합니까? – hshantanu

+0

그게 내 포인트였습니다. 당신이 j = i이든 j = i + 1이든 상관없이 후속 조건식 때문에 같았습니다. 후속 조건이 없다면, python 루프 코드는 j = i + 1과 같습니다. 조합은 같은 요소를 두 번 사용하지 않기 때문입니다. 파이썬에서 조건부없이 j = i를하고 싶다면 다른 상황이고 내 대답은 다를 것입니다. –

1

enumerate 함수에는 시작 인덱스가 없지만 range은 그런 의미입니다. enumerate(sequence, start=0)에는 start 매개 변수가 있지만 반환 된 인덱스의 시작 부분 만 지정하며 목록에 액세스하는 첫 번째 인덱스는 지정하지 않습니다.

그래서 당신은 이런 식으로 할 수 있었다 : 당신이 어쨌든하고있는 루프 중첩되어 무엇 인 목록에서 두 가지 요소를 선택하는 모든 경우에 걸쳐

n = len(lst) 
for i in range(n): 
    val = lst[i] 
    for j in range(i, n): 
     val2 = lst[j] 
     if val != val2: 
      #some code 
1

, 한 가지 (인덱스를 제공) 않습니다 열거. 목록에서 잘리지 않거나 건너 뛰지 않습니다.

for i, val in enumerate(lst): 
    for j, val2 in enumerate(lst[i:], start=i): 
     if val != val2: 
      #some code