2015-02-11 25 views
0

循環我有一個列表定義爲:Python的 - 通過列表按特定的順序

pad = [unhexlify('00' * (16-j) + ('%02d' % j) * j) for j in range(1, 17)] 

這構建了一個填充預言攻擊墊名單。由於這種攻擊是如何工作的,我需要循環遍歷元素2-16,如果我沒有得到回擊並嘗試第一個元素。這裏是循環:

for padsel in pad: #increment pad 
    print(str(hexlify(padsel)) + "- selected pad") 
    for i in range(256): #increment guess 
     g = unhexlify("000000000000000000000000000000" + "{:02x}".format(i)) 
     print(str(hexlify(g)) + "- guess") 
     if attack(g,padsel,ct_prev, ct_target): 
      m2 += "{:02x}".format(i) 
      print(m2) 
      break 
     else: 
      continue 
m2 = m2[::-1] 
print(m2 + "- m2") 

如何更改外部循環定義來做到這一點?

僞代碼:

for padsel in pad (items 2-16): 
    do stuff until hitting a break condition 
else: 
    do stuff on element 1 

感謝。

回答

0

,而不是在使用else子句的for循環,只需修改迭代(列表),您遍歷:

for padsel in (pad[1:16] + [pad[0]]): 
    print(str(hexlify(padsel)) + "- selected pad") 
    for i in range(256): #increment guess 
     g = unhexlify("000000000000000000000000000000" + "{:02x}".format(i)) 
     print(str(hexlify(g)) + "- guess") 
     if attack(g,padsel,ct_prev, ct_target): 
      m2 += "{:02x}".format(i) 
      print(m2) 
      break 
     else: 
      continue 
m2 = m2[::-1] 
print(m2 + "- m2") 

使用else子句將需要的體內的代碼複製循環,或重構身體到一個函數,以便不需要重複。但是,由於第一個項目的處理方式與其他項目相同,因此最簡單的方法是將它組織起來,最後遍歷項目2至16,然後在需要時迭代項目1。

>>> l = range(1,16+1) 
>>> print l 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] 
>>> print l[1:16] + [l[0]] 
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1] 

最後一條語句將列表的第一個元素有效地移動到了列表的末尾。如果你不介意列表是否被修改,或者更喜歡它,你可以這樣做:

>>> l = range(1,16+1) 
>>> l.append(l.pop(0)) 
>>> print l 
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1] 
0

如果你需要保持原始列表不變,請嘗試:

for item in items[1:16]: # iterate through elements 1-17 (list indexes starts at 0 
    do stuff 
    if condition: 
     break 
else: # else in for loops will be run if loop ended normally (w/o `break`) 
    do stuff with items[0] 

請記住,切片名單(名單[X:Y])將創建現有列表的副本。當使用巨大的列表時,這可能會成爲內存問題。