2012-03-17 21 views
0

私はPythonスクリプトを学びたいと思っています。私は条件に私はループに特に、それは非常に難しいのpythonのループを書くための方法を見つけるために探していたC/C++やJavaでPythonでネストされたforループ

をコーディング始め、いくつかのボディなので、私は、文字列のリストAをした、 これらの文字列に対して特定の演算を一度に行う必要があります。つまり、文字列のxorです。 xor(a、b)= xor(b、a)したがって、ループ中に冗長ペアを削除する必要があります。

伝統的なラングでは、私は何かをするだろう

for(i=0;i<len;i++){ 
    for(j=i+1;j<len;j++){ 
     res[count]=xor(a[i],a[j]) 
     count++; 
    } 
} 

私はどのように実装するのですか?彼はPythonと同じですが、私はイテレータを考えることができましたが、より効率的な方法、非常に明白な何かが私の目を逃すか?

+0

答えが実際に説明されていれば、どの部分が何をしているのか説明せずに例を挙げるよりも役に立つでしょう –

答えて

3

Pythonはこのようなもののほとんどは既にあなたのための書かれている、つまり、batteries includedが付属しています。あなたは、文字列の組み合わせをしたい場合は、そのためのdedicated functionがあります:単に

import itertools 

result = [] 
for pair in itertools.combinations(a, 2): 
    result.append(xor(pair[0], pair[1])) 

か:

result = [xor(*p) for p in itertools.combinations(a, 2)] 
+0

これは先頭にする必要があります。しかし、 'xor'関数は組み込まれていません。 'pair [0]^pair [1]'が必要です。 –

0

このネストされたPythonループは、あなたの問題を解決するはずです。ここで

for i in range(len(a)): 
    for j in range(i+1,len(a)): 
     #do stuff 
1

別の翻訳です:Pythonで

res = [] 
for i in range(len(a)): 
    for j in range(i + 1): 
     res.append(a[i]^a[j]) 

かさえ、この1つのライナー

res = [ a[i]^a[j] for i in range(len(a)) for j in range(i) ] 
+0

'range(i、len(a))'を 'range(i ) 'と同じではないためです。 range(i)は '[0..i-1]'を与え、 'range(i、len(a))'は '[i..len(a)-1]'を与えます。 –

+0

私は 'range(i、len(a))!= range(i)'に同意しますが、どちらのforループも同じ範囲の要素をカバーします。鉱山はすべての 'j Doboy

+0

初心者のpythonでこのことを理解していない – sulabh

0

Pythonはの一部としてループを暗示しているので、あなたは、多くの場合、そのようなループを必要としませんスライシングやリスト内包などのシーケンス演算子。また、リストを反復処理している間にリストを変更して、新しいリストを作成する必要はありません。

def xor(s1, s2): 
    return "".join([chr(ord(a)^ord(b)) for a,b in zip(s1, s2)]) 

a = ["ab", "ba", "ab", "ba", "ab", "ba", "ab", "ba", "ab", "ba", "ab", "ba"] 

res = [xor(a,b) for a,b in zip(a[::2], a[1::2])] 
print(repr(res)) 
1

あなたが見ることができるように - itertoolsモジュール内の関数を使用して - それをやってたくさんの方法がありますリライトして書き直してください。しかし、これらは優れていますが、conscisionよりも読みやすさが減ります。そして今はPythonで始まっているので、重要なことの1つは、forループでPythonの方法を考えることです。

そして、ループのためのPythonの方法は次のとおりです。インデックスを反復しない - シーケンスがあり、シーケンスの各要素に対してアクションを実行したい - C(およびその派生物)文字列の長さを計算し、numbeersを0から文字列の長さに反復し、文字列のインデックスとしてそれらの数字を使用します。 Pythonでは、文字列はシーケンスです。これを対話したい要素として使用するだけです。

forループとは別に、Pythonでは、文字列アイテムはlen(1)の部分文字列であり、0〜255の範囲の数値ではないため、これらを整数に明示的に変換してxor演算を実行し、以下のような1行のラムダ関数として書かcanbe:

また
xor = lambda c1, c2: chr(ord(c1)^ord(c2)) 

、あなたはstrignを模倣「ByteArrayの」オブジェクトを使用できますが、多少、彼らは変更可能です意味でのC strignsのように振る舞い、そしてその要素は次のように扱われます0〜255の範囲の数字。あなたのコードについては

res = "" 
for position, char1 in enumerate(a): 
    for char2 in a[position + 1:]: 
     res += xor(char1, char2) 

「列挙」コールは、我々はこのようなケースのための要素自体とともにinteratingされている要素の位置を1与えます。

関連する問題