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

0 投票
5 回答
68 浏览
提问于 2025-04-14 17:23

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

这个算法的目标是把一个叫 lst 的列表分成每组8条记录。同时,还要从一个叫 dct 的字典中加载 lst 中第1到8条、第9到16条和第17到24条记录的值。

为了尽量避免不必要的 for 循环,我想出了这个解决方案。

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 来让它工作,但我相信还有更简洁、更易读的方法。

5 个回答

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+1, i+9):
        print(f'record id: {j:<10} dct id: {j-i:<10} dct value: {dct.get(j-i)}')
    print('--- loop finished ---')
1

块大小就是 dct.keys() 的长度。每当计算结果是零的时候,你就应该把块大小当作键来使用。

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]

chunk_size = len(dct)

for record in lst:
    mod_value = record % chunk_size
    key = mod_value if mod_value else chunk_size
    print(f'record id: {record:<10} dct id: {key:<10} dct value: {dct.get(key)}')
1

你的代码看起来很完美。要减少循环的次数,我想的办法是:创建一个包含8的倍数的列表,比如叫它eight_mult,然后加一个条件判断,比如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 ---')

编辑:如果你想减少代码的长度,在第二行:与其列出所有24个数字,不如直接写成lst = [x for x in range(1,25)]

撰写回答