为了学习,我选择不使用任何额外的库。
该算法的目标是将点亮的
lst
分成块,每个块有 8 个记录。
另外,还从字典 dct
中加载 lst
1-8、9-16、17-24 记录的值。
尽可能避免不必要的
for loops
,我想出了这个解决方案。
dct = {1:'one', 2:'two', 3:'three', 4:'four', 5:'five', 6:'six', 7:'seven', 8:'eight'}
lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]
loop = 0
for record in lst:
print(f'record id: {record:<10} dct id: {record-loop:<10} dct value: {dct.get(record - loop)}')
if record % 8 == 0:
loop += 8
print('--- loop finished ---')
这个输出
record id: 1 dct id: 1 dct value: one
record id: 2 dct id: 2 dct value: two
record id: 3 dct id: 3 dct value: three
record id: 4 dct id: 4 dct value: four
record id: 5 dct id: 5 dct value: five
record id: 6 dct id: 6 dct value: six
record id: 7 dct id: 7 dct value: seven
record id: 8 dct id: 8 dct value: eight
--- loop finished ---
record id: 9 dct id: 1 dct value: one
record id: 10 dct id: 2 dct value: two
record id: 11 dct id: 3 dct value: three
record id: 12 dct id: 4 dct value: four
record id: 13 dct id: 5 dct value: five
record id: 14 dct id: 6 dct value: six
record id: 15 dct id: 7 dct value: seven
record id: 16 dct id: 8 dct value: eight
--- loop finished ---
record id: 17 dct id: 1 dct value: one
record id: 18 dct id: 2 dct value: two
record id: 19 dct id: 3 dct value: three
record id: 20 dct id: 4 dct value: four
record id: 21 dct id: 5 dct value: five
record id: 22 dct id: 6 dct value: six
record id: 23 dct id: 7 dct value: seven
record id: 24 dct id: 8 dct value: eight
--- loop finished ---
有更多数学经验的人可以建议我如何在本节中完全摆脱变量
loop
if record % 8 == 0:
loop += 8
而是使用一些数学公式代替
record - loop
如果我只是使用
dct.get(record % 8)
我会得到错误的结果,因为 record % 8
生成此代码
1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0
我需要
1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8
当然,我可以使用像这样的野蛮修复
((record - 1) % 8) + 1
来使其工作,但我确信有更干净、更易读的方法来做到这一点。
我认为您可能对循环的工作原理有误解。
每个循环都在代码块的底部完成。
loop = 0
for record in lst:
# code here
loop += 1
print('--- loop finished ---')
对于您的第一个例子,您将进行 24 个循环。
但是,看起来您并不是在寻找循环编号,而是在寻找 1-8 的计数器。
counter = 1
for record in lst:
value = dct.get(counter)
print(f'{record =:<10} {counter = :<10} {value = }')
if record % 8 == 0:
counter = 1
else:
counter += 1
record = 1 counter = 1 value = 'one'
record = 2 counter = 2 value = 'two'
record = 3 counter = 3 value = 'three'
record = 4 counter = 4 value = 'four'
record = 5 counter = 5 value = 'five'
record = 6 counter = 6 value = 'six'
record = 7 counter = 7 value = 'seven'
record = 8 counter = 8 value = 'eight'
-- counter reset --
record = 9 counter = 1 value = 'one'
record = 10 counter = 2 value = 'two'
record = 11 counter = 3 value = 'three'
record = 12 counter = 4 value = 'four'
record = 13 counter = 5 value = 'five'
record = 14 counter = 6 value = 'six'
record = 15 counter = 7 value = 'seven'
record = 16 counter = 8 value = 'eight'
-- counter reset --
record = 17 counter = 1 value = 'one'
record = 18 counter = 2 value = 'two'
record = 19 counter = 3 value = 'three'
record = 20 counter = 4 value = 'four'
record = 21 counter = 5 value = 'five'
record = 22 counter = 6 value = 'six'
record = 23 counter = 7 value = 'seven'
record = 24 counter = 8 value = 'eight'
-- counter reset --
您的代码似乎很完美。我猜想减少循环的唯一方法是:创建一个包含 8 的倍数的列表,比如八倍,并提供一个条件语句,如
if record in eight_mult: print('--- loop finished ---')
。
dct = {1:'one', 2:'two', 3:'three', 4:'four', 5:'five', 6:'six', 7:'seven', 8:'eight'}
lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]
eight_mult = [x*8 for x in range(1,4)]
loop = 0
for record in lst:
print(f'record id: {record:<10} dct id: {record-loop:<10} dct value: {dct.get(record - loop)}')
if record in eight_mult: print('--- loop finished ---')
您可以使用嵌套的 for 循环。您不需要 lst 列表
dct = {
1: "one",
2: "two",
3: "three",
4: "four",
5: "five",
6: "six",
7: "seven",
8: "eight",
}
for i in range(0, 24, 8):
for j in range(i, i+8):
print(f'record id: {j+1:<10} dct id: {j-i+1:<10} dct value: {dct.get(j-i+1)}')
print('--- loop finished ---')