我将数据结构化为嵌套列表my_lst
,其循环的示例输出:
['A', 2312]
['B', 2000]
['C', 1312]
etc...
每个列表的元素1 = download_budget
我有一个值download_total = 5000
我试图通过根据以下规则在不同列表中传播download_target值来为每个列表附加2个值:
使用示例:
my_lst = [['A', 2312],
['B', 2000],
['C', 1312],
['D', 3000]]
将download_total
作为5000
的应该产生
的输出['A', 2312, 0, 0]
['B', 2000, 265, 1] # total d/l = 2312
['C', 1312, 218, 2] # total d/l = 2312 + 2000 = 4312
['D', 3000, 906, 2] # total d/l = 5000
# i.e. (2 * 2047) + 906
第一个条目始终是给定的偏移量(e.g. 0, 0)
。
第二个条目读取第一个条目的download_budget
(2312),并尝试根据所描述的规则传播值,确保不超过download_total
。
我的尝试:
el2 = 0
el3 = 0
for i, element in enumerate(my_lst):
if i == 0:
element.append(el2)
element.append(el3)
if i >= 1:
download_budget = my_lst[i-1][1]
while (download_budget > 2047):
el3 += 1
download_budget = download_budget - 2047
if download_budget < 2047:
el2 = download_budget
element.append(el2)
element.append(el3)
基本上,我可以掌握如何做到这一点,但知道是否有更好的方法可以帮助我们知道
答案 0 :(得分:1)
您的代码位于正确的轨道上,但是在您遍历列表并忽略最终案例时,您不会累积下载预算。并且由于没有累积download_budget
,你的while循环仅在第二行(i == 1
)得到满足,所以其他任何东西都不能正常工作。
除了解决这些问题之外,你可以通过使用modulo(%
)获取第三列和整数除法/余数(//
)来获得最后一列条目来简化它。
所以,代码看起来像是:
download_total = 5000
budget = 0
for i, row in enumerate(my_lst):
if i == 0:
row += [0, 0]
else:
target = min(budget, download_total)
row += [target % 2047 + my_lst[0][2], target // 2047 + my_lst[0][3]]
budget += row[1]
给出了我们预期的输出:
[['A', 2312, 0, 0],
['B', 2000, 265, 1],
['C', 1312, 218, 2],
['D', 3000, 906, 2]]
如果您遇到任何问题,只需删除评论,但可能会引起轻微混淆的是使用min()
功能。在这一行,目标是分配一个值 - target
- 这是我们的目标,即该行应该是什么(第三和第四列)。
所以我们希望这个目标尽可能大:我们所有的预算。 但是,在预算超出download_total
(最后一行)的情况下,我们希望此行为下载总数,而不是更大的预算。