簡體   English   中英

迭代數組兩次(笛卡爾積),但只考慮一半的元素

[英]Iterate over array twice (cartesian product) but consider only half the elements

我試圖迭代一個數組兩次以擁有元素對(e_i,e_j),但我只想要i <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找到我想要的東西(我發現最接近的是itertools.product(*iterables[, repeat]) )。

我嘗試了一些事情,但我並不相信他們中的任何一個:

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

我仍然相信有更好更多的pythonic解決方案。 任何建議都是受歡迎的。

只需使用itertools.combinations(my_list, 2)

你不能只使用range功能並使用:

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

我建議如下:

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

對於大多數解釋語言,for循環不是最佳選擇。 Python提供了列表理解,它更具可讀性和效率。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM