我试图迭代一个数组两次以获得元素对(e_i,e_j),但我只想要这样的元素,即i<学家
基本上,我想要的就像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解决方案。欢迎提出任何建议。
答案 0 :(得分:8)
只需使用itertools.combinations(my_list, 2)
。
答案 1 :(得分:2)
您不能只使用range
功能并使用:
vect = [...]
for i in range(0, len(vect)):
for j in range(i+1, len(vect)):
do_something()
答案 2 :(得分: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提供了列表理解,它更具可读性和效率。