对数组进行两次迭代(笛卡尔积),但仅考虑一半的元素

4

我正在尝试两次迭代数组,以获得元素对(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

我仍然相信有更好的、更符合Python风格的解决方案。欢迎提出任何建议。


5
itertools.combinations 是什么? - BrenBarn
3个回答

10

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


2

你不能只使用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)] ) ]

对于大多数解释型语言来说,for循环并不是最好的选择。Python提供了列表推导式,这种方式更易读且更高效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接