2013-07-21 1 views
3

배열 쌍을 두 번 반복하려고합니다 (e_i, e_j)하지만 나는 요소를 원합니다. < j.배열을 두 번 반복 (직교 좌표 곱하기)하지만 요소의 반만을 고려하십시오.

기본적으로 내가 원하는 것은 C와 유사한 언어입니다.

int my_array[N] = ...; 
for (int i=0; i<N; i++) 
     for (int j=i+1; j<N; j++) 
       something(my_array[i],my_array[j]); 

나는 (내가 찾은 가장 가까운 것은 itertools.product(*iterables[, repeat])이었다) itertools에서 찾던 찾지 못했습니다.

나는 몇 가지를 시도했지만 나는 정말 그들 중 납득하고 있지 않다 :

my_list=range(10) 

# Using enumerate and slices - explicit loop 
res=[] 
for i,j in enumerate(my_list): 
     for k in my_list[i+1:]: 
       res.append((j,k)) 
print res 

# Using enumerate and slices - list comprehension 
res=[(j,k) for i,j in enumerate(my_list) for k in my_list[i+1:]] 
print res 

# Using enumerate and xrange - explicit loop 
res=[] 
for i,j in enumerate(my_list): 
     for k in range(i+1, len(my_list)): 
       res.append((j,my_list[k])) 
print res  

# Using enumerate and xrange - list comprehension 
res=[(j,my_list[k]) for i,j in enumerate(my_list) for k in range(i+1, len(my_list))] 
print res 

나는 아직도 더 많은 파이썬 솔루션이 있음을 확신합니다. 어떤 제안이라도 환영합니다.

+5

'itertools.combinations'는 어떤가요? – BrenBarn

답변

7

그냥 itertools.combinations(my_list, 2)를 사용합니다.

1

당신은 단지 range 기능을 사용하고 갈 수 없습니다 :

vect = [...] 
for i in range(0, len(vect)): 
    for j in range(i+1, len(vect)): 
     do_something() 
0

나는 다음을 제안합니다 : 대부분의 해석 언어에 대한

midIdx = len(mylist)/2 
[ dosomehing(ele_i, ele_j) for ele_i, ele_j in 
    zip(mylist[0:midIdx], mylist[midIdx + 1:len(mylist)]) ] 

, 루프가 최선의 선택을하지 않습니다에 대한. 파이썬은보다 이해하기 쉽고 효율적인 목록 이해력을 제공합니다.