【问题标题】:Python - Iterating through 2 list with arithmetic functionPython - 使用算术函数遍历 2 个列表
【发布时间】:2021-05-23 19:04:37
【问题描述】:

我有 2 个 python 列表,stock_level 用于跟踪库存数量,required 用于指示 stock_level 中每个项目需要的数量创建每个产品。

stock_level = [70, 20, 20 , 20] 
required = [20, 20, 20, 20]

我如何遍历这 2 个列表以找出可以制造多少产品以及制造产品后剩余的库存,即在给定上述值的情况下,只能制造 1 个产品并且 stock_level最终应该是 [50, 0, 0, 0]

编辑: 只有 stock_level 中的所有值都大于 required 时才能生产产品。如果,

stock_level = [20, 20, 20, 20]
required = [70, 20, 20, 20]

由于stock_level 中的第一个元素小于required 中的第一个元素,因此不应生产任何产品。仅当 stock_level 中的值大于 required 中的相应元素时,才应制作产品。

stock_level = [70, 20, 20, 20]
required = [20, 20, 20, 20]

在这个例子中,应该只生产 1 个产品,因为在第一次运行后,stock_level 将变为 [50, 0, 0, 0],第二次将没有足够的库存stock_level 的第 4 个元素来制作另一个产品。

我想出了这样的东西。

made = 0
for x in required:
    for y in stock_level:
        while True:
            if x > y:
                print("Insufficient")
                break
            else:
                # stock_leve minus required
                print("Product created")
            made += 1

【问题讨论】:

    标签: python list loops for-loop while-loop


    【解决方案1】:

    您的代码正在嵌套循环,但您需要并行遍历这两个列表。此外,您最终会陷入无限循环。

    虽然压缩数组是最好的选择,但在这里找到使用enumerate 的调整版本,它应该可以帮助您理解。

    库存不足的情况没有处理。

    stock_level = [70, 20, 20 , 20] 
    required = [20, 20, 20, 20]
    
    for i, x in enumerate(required):
        y = stock_level[i]
        if x > y:
            print("Insufficient")
        else:
            # stock_leve minus required
            print("Product created")
            made = y - x
            stock_level[i] = made
    
    stock_level #=> [50, 0, 0, 0]
    

    编辑后更新,如果我明白了。 问题仍然是嵌套循环和使用的逻辑本身。

    要了解以下实现,请深入了解文档:

    这是一个可能的实现:

    stock_level = [70, 40, 40, 50] 
    required = [20, 20, 20, 20]
    
    tmp = zip(stock_level, required)
    tmp = list(zip(stock_level, required))
    makeable = 0
    
    while True:
        update_make = tmp
        tmp = [ [stk - req, req] for stk, req in tmp ]
        can_be_made = all([stk >= 0 for stk, _ in tmp])
        if can_be_made:
            makeable += 1
        else:
            break
            
    print(makeable) #=> 2
    print(update_make) #=> [[30, 20], [0, 20], [0, 20], [10, 20]]
    actual_stock_level = [stk for stk, req in update_make]
    print(actual_stock_level) #=> [30, 0, 0, 10]
    

    【讨论】:

    • 您好,感谢您的快速回复。您提供的代码有效,但是,我想知道是否有任何方法可以跟踪已经生产了多少产品,即它进入代码的 else 部分的次数。
    • 抱歉解释不佳。我已经添加到编辑中。关键是,为了生产产品,需要从 stock_level 的第 1 到第 4 个元素进行库存,并且在任何时间点,如果 stock_level 中的值低于所需的相应值,则不应生产任何产品.
    【解决方案2】:

    您可以使用zip() 一起遍历两个列表。类似[max(a-b,0) for a,b in zip(l1, l2)]

    【讨论】:

    • 原谅我,但我对 python 有点陌生。你能给我提供更多解释吗?有没有办法跟踪已经创建了多少产品?谢谢!
    • 如果这回答了您的问题,请点赞并接受。我很乐意跟进解释...
    【解决方案3】:

    试试这个。为添加的项目创建一个新列表是一个好主意,这样我们就可以减少实现这一目标的步骤数。

    stock_level = [70, 2, 20 , 20] 
    required = [20, 20, 20, 20]
    new_stock_level = []
    
    for i, x in enumerate(required):
        y = stock_level[i]
        made = y - x
        if made <= 0:
            print("Insufficient")
        else:
            # stock_leve minus required   
            new_stock_level.append(made)
            print("Product created")
    print(new_stock_level, "\nNumber of product created: {}".format(len(new_stock_level)))
    

    【讨论】:

    • 您好,感谢您的快速回复。您提供的代码有效,但是,我想知道是否有任何方法可以跟踪已经生产了多少产品,即它进入代码的 else 部分的次数。
    • 是的,当然。 i 是提供了多少产品。只需将 print(i) 添加到 else 或在循环后添加 print(len(stock_level)) 即可。我已经修改了我的答案以满足您的要求。
    • 抱歉,我的解释可能不清楚。只有当 stock_level 列表中的所有值都大于 required 时,才能生产产品。例如,如果 stock_level = [20, 20, 20, 20] 并且 required = [70, 20, 20, 20],则不应生产任何产品。在您提供的代码中,仍在制作 3 个产品。谢谢!
    • 我再次修改了我的代码。查看新代码 sn-p。
    • 它仍然返回“创建的产品数量:1”,即使 stock_level 列表的第二个成员小于您提供的代码中所需的成员,在这种情况下创建的产品应该具有0
    猜你喜欢
    • 2014-06-26
    • 2011-03-18
    • 1970-01-01
    • 2017-04-12
    • 2011-04-26
    • 2018-04-25
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多