【问题标题】:How to alter this code to allow appending to the list?如何更改此代码以允许附加到列表?
【发布时间】:2020-03-28 22:29:15
【问题描述】:

在这段代码之后附加或实际上打印任何内容时遇到问题:

reversedPriv = [52,27,13,6,3,2]
array= [9]
var = 0
numA = []
for i in array:
    for j in reversedPriv:
        while var!= j:
            if j < i:
                var = var + j
                numA.append(j)
                numA.sort()
print(numA)

我希望它将 [3,6] 附加到 numA 并打印,但它目前什么都不做。我忽略的 while 循环是否存在某些条件?

代码的重点是找出“reversedPriv”中的哪些元素与“array”中的每个元素相加,并将它们附加到列表“numA”中。例如,从 'reversedPriv' 列表中,只有 6 和 3 的总和为 9。所以 numA = [3,6] 目前 'array' 只有一个元素,但代码应该能够将其放大 n 个元素.

【问题讨论】:

  • var 永远不会等于 j 所以 while 循环永远不会结束
  • 存在无限循环,因为 var 不等于 reversedPriv 的元素

标签: python for-loop debugging while-loop nested


【解决方案1】:

因此,总的来说,在 SO 上明确问题是什么是一个好主意,但提供问题的背景通常会更好。

您正在研究的是背包求解器的一个片段。正如我在下面的 cmets 中所提到的,您最好只使用开箱即用的 or-tools,如下所示(取自 https://developers.google.com/optimization/bin/knapsack):

from ortools.algorithms.pywrapknapsack_solver import KnapsackSolver

def knapsack():
    solver = KnapsackSolver(
       KnapsackSolver.KNAPSACK_MULTIDIMENSION_BRANCH_AND_BOUND_SOLVER,
      'KnapsackExample'
    )
    weights = [[52,27,13,6,3,2]]
    capacities = [9]

    solver.Init(weights[0], weights, capacities)
    computed_value = solver.Solve()

    packed_items = []
    packed_weights = []
    total_weight = 0
    print('Total value =', computed_value)
    for i in range(len(weights[0])):
        if solver.BestSolutionContains(i):
            packed_items.append(i)
            packed_weights.append(weights[0][i])
            total_weight += weights[0][i]

    print('Total weight:', total_weight)
    print('Packed items:', packed_items)
    print('Packed_weights:', packed_weights)

knapsack()

控制台:

Total value = 9
Total weight: 9
Packed items: [3, 4]
Packed_weights: [6, 3]

【讨论】:

  • 感谢您的反馈。我只在列表中放了一个元素进行调试,但代码应该运行一个包含“n”个元素的列表。此代码的目的是解密背包算法。例如,如果数组是 array = [921, 1482, 1274, 1274, 1630] 那么我不确定这是否可行。
  • @socket_programmer,对不起 - 但是如果你想在一个数组中使用
  • 对不起,如果有点令人费解,我编辑了原始帖子,但我将在这里再次发布我的编辑:代码的重点是找到“reversedPriv”中的哪些元素对每个元素求和在“数组”中并将它们附加到列表“numA”中。例如,从 'reversedPriv' 列表中,只有 6 和 3 的总和为 9。所以 numA = [3,6] 目前 'array' 只有一个元素,但代码应该能够将其放大 n 个元素.希望这会有所帮助。
  • 啊。您是否有理由不能只使用 OR-Tools? developers.google.com/optimization/introduction/python
【解决方案2】:

我不确定您要做什么,但您似乎想要 6 + 3 = 9,将 6,3 附加到 numA

for it1 in reversedPriv:
    for it2 in reversedPriv:

        sumit = it1 + it2     # sum 1st iteraction with 2nd iteraction

        if sumit == array[0]: #extract array value from list

            if it1 not in numA and it2 not in numA:
                numA.append(it1)
                numA.append(it2)

print(numA)
#[6, 3]

【讨论】:

    【解决方案3】:

    应该是var != i,而不是j

    reversedPriv = [52,27,13,6,3,2]
    array= [9]
    var = 0
    numA = []
    for i in array:
        for j in reversedPriv:
            while var!= i:
                if j < i:
                    var = var + j
                    numA.append(j)
                    numA.sort()
                    break
                break
    print(numA)
    

    或者没有时间,

    reversedPriv = [52,27,13,6,3,2]
    array= [9]
    var = 0
    numA = []
    for i in array:
        for j in reversedPriv:
            if (var != i) and j < i:
                var = var + j
                numA.append(j)
    numA.sort()
    print(numA)
    

    或者,

    reversedPriv = [52,27,13,6,3,2]
    array= [9]
    var = 0
    numA = []
    numA = [sorted([x,y]) for x,y in zip(reversedPriv[:-1],reversedPriv[1:]) if x+y == array[0]][0]
    print(numA)
    

    输出:

    [3, 6]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-07
      • 2010-12-16
      • 2021-12-09
      • 1970-01-01
      • 2019-03-31
      • 1970-01-01
      相关资源
      最近更新 更多