2012-03-20 11 views
4

Pythonで次のものと同等のものは何ですか?PythonでC++スタイルの(ネストされた)ネストループを実行する方法は?

for (i=0; i<n; i++) 
    for (j=i+1; j<n; j++) 
     //do stuff with A[i], A[j] 

またはある意味では以下のとおりです。また、ループの各ラウンドの終了時にAから要素を削除する必要があります。

for a in A: 
    for a' in A/{a}: #i.e. rest of the elements of A 
     #do something with a,a' 
    #remove a from A 

列挙使用せずにこれを行うためのニシキヘビ方法はありますか()?

編集:

ご迷惑をかけて申し訳ありません。最初の例で

  1. 、私はインデックスとしてIを& Jを使用することを意味します。それらの値は関係ありません。後者のC + +に相当するものです。

  2. 外側ループはn回実行されます。内側ループは、外側ループの反復ごとに(n-1)、(n-2)... 0回実行される。

多分これは、(擬似コード)を助けるかもしれない:

function next_iteration(list): 
    head = first element 
    tail = remaining elements #list 
    each element in tail interacts with head one by one 
    next_iteration(tail) 

PS:上記のすべてのコードサンプルは、擬似コードです。私はまだ心の中で少し曖昧なことを表現しようとしています。

for i in range(0,n): 
    for j in range (i+1,n): 
    # do stuff 
+2

あなたの2つのループは同じことをしません。一つを選ぶ! – katrielalex

+1

@katrielalex - 明示的ではありませんが、概念的には、同じシーケンス上でネストされたループを表すことができます。内部ループは、外側ループの現在の要素の直後から開始します。 –

+0

2番目の例では、開始時に内部ループを開始し、要素 'a'をスキップします。 – hochl

答えて

3

あなたの二つの質問が異なっているので、ここではあなたの第二の問題のためのソリューションです:使用して

for i in xrange(len(A)): 
    for j in xrange(len(A)): 
     if i != j: 
      do_stuff(A[i], A[j]) 

またはitertools(私が使用してと思うが含まについてどのように

+0

こんにちは、ほぼそこに。 :) (a、b)と(b、a)が同じように動作させることができますか?つまり、順序は関係ありません。 – Karthick

+0

私は 'itertools.combinations'がそのトリックをすると思います。 – hochl

0

電池は非常に無色です!):

import itertools 

for a, b in itertools.permutations(A, 2): 
    do_stuff(a, b) 

これは単に使用私はあなたが結果を保存したいA.から2つの異なる要素のすべての組み合わせにdo_stuff適用されます。

[do_stuff(a, b) for a, b in itertools.permutations(A, 2)] 
0
for i in range(0,n): 
    for j in range(i+1,n): 
    # do stuff 
0

はまだコメントを残すことができません..しかし、基本的にはどのような他の2ポストは言った - しかし、範囲の代わりにxrangeを使う習慣に入る。

for i in xrange(0,n): 
    for j in xrange(i+1,n): 
    # do stuff 
+0

'range()'は、python 3でジェネレータを返します。x – rplnt

+0

それはありますが、opはバージョンを決して指定しませんでしたので、<3.x:と仮定する傾向があります。 – headcrab

+0

2.xは途中で、3.xは途中で '範囲 '。 –

0

あなたは、それぞれ下記のショーとしてのiとjの値を生成するためにxrangeを使用することができます:あなたは、スライス上に直接内側のループを作ることができ

for i in xrange(0, n): 
    for j in xrange(i + 1, n): 
     # do stuff 
0

。これはいいとは言えませんが、別のアプローチです。これにアプローチする

for i in range(0,len(x)): 
    a = x[i] 
    for b in x[i+1:]: 
    print a, b 
0

もう一つの方法は - 反復可能なインタフェースを提供シーケンスであるnは場合は、Pythonであなたが直接オブジェクトを反復することで、あなたのコードを簡素化することができます。

for i in n: 
    for some_var in n[n.index(i):]: # rest of items 
    # do something 

I他の人が述べたように、私はあなたのループを正しく理解してくれることを願っています。彼らは同じことをしません。

4

私はあなたが私がコンテナの異なる要素のすべてのペアを反復処理するにはどうすればよい

よう求めているものをintepret?

回答:

>>> x = {1,2,3} 
>>> import itertools 
>>> for a, b in itertools.permutations(x, 2): 
...  print a, b 
... 
1 2 
1 3 
2 1 
2 3 
3 1 
3 2 

EDIT:あなたは両方が(a,b)(b,a)、だけではなく、itertools.combinationsを使用したくない場合。ご質問の最初のもののために

+0

各ペアの要素の順序を考慮せずに、個別の要素のすべてのペア。これはどのように変わるのでしょうか? – Karthick

+1

@Karthickは代わりに '.combinations'を使います。 [the docs](http://docs.python.org/library/itertools.html#itertools.combinations)を参照してください。 – katrielalex

0

、すでに他の回答で述べたように:1秒間

for i in xrange(n): 
    for j in xrange(i+1, n): 
     # do stuff with A[i] and A[j] 

for i, a in enumerate(A): 
    for b in A[i+1:]: 
     # do stuff with a and b 
0

あなたの擬似コードはほとんどそれを持っている:

function next_iteration(list): 
    head = first element 
    tail = remaining elements #list 
    each element in tail interacts with head one by one 
    next_iteration(tail) 

Pythonコード:

def next_iteration(lst): 
    head, tail = lst[0], lst[1:] 
    for item in tail: 
     print(head, item) 
    if tail: 
     next_iteration(tail) 

next_iteration([1, 2, 3])と試みたときに、プリント:

1 2 
1 3 
2 3 
0

アレイをウォークスルーし、インデックスを作る最初のforループ、列挙()において、第二のに利用可能な各要素の値forループ。 2番目のループでは、の範囲()は、j = i + 1 - > len(a)を使用可能にします。この時点で、あなたはあなたが必要とするものを正確に持っています。あなたの操作はi & jです。

>>> a = [1,2,3,4] 
>>> array_len = len(a) 
>>> for i,v in enumerate(a): 
... for j in range(i+1, array_len): 
...  print a[i], a[j] 
... 
1 2 
1 3 
1 4 
2 3 
2 4 
3 4 
>>> 
関連する問題