在列表中的列表中传播值

时间:2018-04-11 16:57:18

标签: python python-3.x python-2.7

我将数据结构化为嵌套列表my_lst,其循环的示例输出:

['A', 2312]
['B', 2000]
['C', 1312]
etc...

每个列表的元素1 = download_budget

我有一个值download_total = 5000

我试图通过根据以下规则在不同列表中传播download_target值来为每个列表附加2个值:

  • 元素2 2047的最大值
  • 元素3每次元素2超过2047时递增1

使用示例:

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)

基本上,我可以掌握如何做到这一点,但知道是否有更好的方法可以帮助我们知道

1 个答案:

答案 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(最后一行)的情况下,我们希望此行为下载总数,而不是更大的预算。