2012-03-17 185 views
0

我想學習python腳本。作爲一些機構誰開始編碼C/C++或Java我發現它非常難尋找途徑來寫循環的蟒蛇,特別是對於循環與條件Python中的嵌套for循環

我有字符串列表A, 我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++; 
    } 
} 

那麼我該如何實現t他和Python一樣,我可以想到迭代器,但有沒有更有效的方法,非常明顯的東西躲過我的眼睛?

+0

如果答案實際上解釋了for循環的工作方式,而不是給出示例而不解釋每個部分的作用 – 2012-03-17 12:44:26

回答

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]'。 – 2012-03-17 12:26:57

0

這個嵌套的Python循環應該可以解決您的問題。

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

這裏是另一個翻譯:

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

甚至這一個班輪

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

您不能用'range(i)替換'range(i,len(a))' )'因爲它們不相同。 'range(i)'給出'[0..i-1]'和'range(i,len(a))'給出'[i..len(a)-1]'。 – 2012-03-17 19:13:04

+0

我同意range(i,len(a))!= range(i)'但是,for循環都覆蓋了相同的元素範圍。我的所有'j Doboy 2012-03-17 19:24:03

+0

Python新手不會理解這個 – sulabh 2012-03-20 08:47:47

0

在Python往往不需要這樣的循環,因爲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,所以重要的一點是要學會以「for」循環思考Python方式。對於循環的Python方法是:你不迭代索引 - 你有序列,並且你想爲序列上的每個元素執行動作 - 在C(及其派生)中,計算字符串長度,迭代從0到字符串長度的數字,將這些數字作爲字符串的索引使用。在Python中,該字符串是一個序列 - 您只是將它用作要與之交互的元素。

除了for循環,在Python中,字符串項是len(1)的子串,而不是0-255範圍的數字,所以你必須顯式地將它們轉換爲整數,執行xor操作,然後返回canbe寫成一行lambda函數如:

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

或者,你可以使用「字節組」對象,模仿strign,但在某種程度上表現爲在一定意義上,他們是可變的çstrigns,和它的元素都被視爲數字在0-255範圍內。

至於你的代碼:

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

的「枚舉」電話給了一個我們正在與元素本身對這樣的情況下沿的作用中元素的位置。