使这个Python循环算法更简洁(涉及数学)
为了学习,我决定不使用任何额外的库。
这个算法的目标是把一个叫 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)]
。