将值分散到存储箱中的列表中

2024-05-23 19:18:56 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

每个列表的元素1=download_budget

我有一个值download_total = 5000

我正试图根据以下规则,通过将download\u目标值分散到不同的列表中,为每个列表添加2个值:

  • 元素2 2047的最大值
  • 当元素2超过2047时,元素3增加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)。 第二个条目读取第一个条目(2312)的download_budget,并尝试根据所描述的规则分散值,确保不超过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)

基本上,我已经掌握了如何做到这一点,但是知道是否有更好的方法来做到这一点会很有用


Tags: 元素示例列表if规则mydownload条目
1条回答
网友
1楼 · 发布于 2024-05-23 19:18:56

你的代码是在正确的轨道上,但不太工作,因为你没有积累下载预算,因为你遍历列表,并忽略了最终的情况。由于没有累积download_budget,您只满足了第二行(i == 1)的while循环,因此其他任何东西都不能正常工作。你知道吗


除了解决这些问题之外,您还可以通过使用模(%)来获得第三列,使用整数除法/余数(//)来获得最后一列条目来简化它。你知道吗

所以,代码应该是这样的:

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 budget超过download_total(最后一行),我们希望这一行是下载总数,而不是更大的are budget。你知道吗

相关问题 更多 >