Python - 按特定顺序遍历列表
Python - loop through list in specific order
我有一个列表定义为:
pad = [unhexlify('00' * (16-j) + ('%02d' % j) * j) for j in range(1, 17)]
这为填充 oracle 攻击构造了一个填充列表。由于这种攻击的工作原理,我需要循环遍历元素 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
谢谢。
如果您需要保持原始列表不变,请尝试:
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]
请记住,切片列表 (list[x:y]) 将创建现有列表的副本。当与大列表一起使用时,这可能会成为内存问题。
与其在 for 循环中使用 else 子句,不如修改迭代的可迭代对象(列表):
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 子句需要复制 for 循环主体中的代码,或者将主体重构为一个函数,这样就不需要重复了。但是,由于第一个项目的处理方式与其他项目相同,因此最简单的方法是组织它最后处理,方法是迭代项目 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]
我有一个列表定义为:
pad = [unhexlify('00' * (16-j) + ('%02d' % j) * j) for j in range(1, 17)]
这为填充 oracle 攻击构造了一个填充列表。由于这种攻击的工作原理,我需要循环遍历元素 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
谢谢。
如果您需要保持原始列表不变,请尝试:
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]
请记住,切片列表 (list[x:y]) 将创建现有列表的副本。当与大列表一起使用时,这可能会成为内存问题。
与其在 for 循环中使用 else 子句,不如修改迭代的可迭代对象(列表):
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 子句需要复制 for 循环主体中的代码,或者将主体重构为一个函数,这样就不需要重复了。但是,由于第一个项目的处理方式与其他项目相同,因此最简单的方法是组织它最后处理,方法是迭代项目 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]