【问题标题】:Iterate over array twice (cartesian product) but consider only half the elements迭代数组两次(笛卡尔积),但只考虑一半的元素
【发布时间】:2013-07-20 01:16:58
【问题描述】:

我试图对数组进行两次迭代以获得元素对 (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 的解决方案。欢迎提出任何建议。

【问题讨论】:

  • itertools.combinations 呢?

标签: python iterator combinations itertools


【解决方案1】:

我建议如下:

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 提供列表推导,可读性更强,效率更高。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      你不能只使用range 函数并使用:

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

      【讨论】:

        猜你喜欢
        • 2017-09-28
        • 2017-03-05
        • 1970-01-01
        • 2012-05-29
        • 2012-08-27
        • 1970-01-01
        • 2022-11-22
        • 1970-01-01
        • 2016-02-24
        相关资源
        最近更新 更多