Python 在存储箱中的列表中分布值
我将数据结构化为嵌套列表Python 在存储箱中的列表中分布值,python,python-3.x,python-2.7,Python,Python 3.x,Python 2.7,我将数据结构化为嵌套列表my_lst,循环的示例输出: ['A', 2312] ['B', 2000] ['C', 1312] etc... 每个列表的元素1=download\u budget 我有一个值download\u total=5000 我试图通过根据以下规则将下载\ U目标值分散到不同的列表中,为每个列表添加2个值: 元素2 2047的最大值 元素2每超过2047,元素3就会增加1 示例使用: my_lst = [['A', 2312], ['B', 20
my_lst
,循环的示例输出:
['A', 2312]
['B', 2000]
['C', 1312]
etc...
每个列表的元素1=download\u budget
我有一个值download\u total=5000
我试图通过根据以下规则将下载\ U目标值分散到不同的列表中,为每个列表添加2个值:
- 元素2 2047的最大值
- 元素2每超过2047,元素3就会增加1
my_lst = [['A', 2312],
['B', 2000],
['C', 1312],
['D', 3000]]
使用download\u 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
第一个条目始终是给定的偏移量(例如0,0)
。
第二个条目读取第一个条目(2312)的download\u budget
,并尝试根据所述规则传播值,确保不超过download\u总数
我的尝试:
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)
el2=0
el3=0
对于i,枚举中的元素(my_lst):
如果i==0:
元素。追加(el2)
元素。追加(el3)
如果i>=1:
下载_budget=my_lst[i-1][1]
而(下载预算>2047):
el3+=1
下载预算=下载预算-2047
如果下载预算<2047:
el2=下载预算
元素。追加(el2)
元素。追加(el3)
基本上,我已经掌握了如何做到这一点,但是如果知道是否有更好的方法来做到这一点,那将是非常有用的您的代码在正确的轨道上,但是不太有效,因为您在遍历列表时没有积累下载预算,并且忽略了最终案例。由于没有累计下载_预算
,您的while循环只满足第二行(i==1
)的要求,因此其他任何东西都不能正常工作
除了解决这些问题,您还可以通过使用模(%
)获得第三列和整数除法/余数(/
)获得最后一列条目来简化它
因此,其代码如下所示:
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()
函数。在这一行中,are目标是分配一个值-target
,这是我们的目标,该行的数字应该是多少(第三列和第四列)
所以我们希望这个目标尽可能大:我们所有的预算。但是,如果are预算超过下载总量(最后一行),我们希望这一行是下载总量,而不是更大的are预算。非常感谢您的帮助。如果初始i==0行偏移量与(0,0)不同怎么办?您所说的“与[0,0]
不同”是什么意思?只需将行+=[0,0]
替换为您想要的开头:)也请接受!我更改了初始行值,但其他行对偏移量的更改没有反应。例如,行+=[10,2]
。。。。。最后一行保持为['B',2000,265,1]
。。。它应该改成['B',2000,275,3]
@arsenal88为什么要改成那样?其他行不依赖于前几行的下载,它们只依赖于前几行预算的总和-至少这就是问题中的示例的工作方式。请解释为什么它应该更改为该行,因此初始行很重要,因为它是所有其他行应该遵循的初始偏移量。因此,(10,2)的偏移意味着其他人应该根据规则考虑这个偏移。起初我没有强调这一点,因为我试图了解如何应用最简单的解决方案(即0,0)。为不够清晰而道歉!