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)。为不够清晰而道歉!