3

配列を 2 回繰り返して要素のペア (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な解決策があると確信しています。どんな提案でも大歓迎です。

4

3 に答える 3

2

range関数を使用して、次のようにすることはできませんか。

vect = [...]
for i in range(0, len(vect)):
    for j in range(i+1, len(vect)):
        do_something()
于 2013-07-21T02:00:41.873 に答える
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 は、より読みやすく効率的なリスト内包表記を提供します。

于 2013-07-21T02:17:28.007 に答える