使这个Python循环算法更短(涉及数学)

问题描述 投票:0回答:3

为了学习,我选择不使用任何额外的库。

该算法的目标是将点亮的

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
来使其工作,但我确信有更干净、更易读的方法来做到这一点。

python loops mathematical-optimization mathematical-expressions
3个回答
0
投票

我认为您可能对循环的工作原理有误解。

每个循环都在代码块的底部完成。

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 --

0
投票

您的代码似乎很完美。我猜想减少循环的唯一方法是:创建一个包含 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 ---')

0
投票

您可以使用嵌套的 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 ---')
© www.soinside.com 2019 - 2024. All rights reserved.