【问题标题】:How to make nested list behave like numpy array?如何使嵌套列表表现得像 numpy 数组?
【发布时间】:2021-02-19 23:56:23
【问题描述】:

我正在尝试实现一种算法来计算python中给定总和的子集

import numpy as np 
  
maxN = 20
maxSum = 1000
minSum = 1000
base = 1000
dp = np.zeros((maxN, maxSum + minSum))
v = np.zeros((maxN, maxSum + minSum)) 
# Function to return the required count  
def findCnt(arr, i, required_sum, n) : 
    # Base case  
    if (i == n) : 
        if (required_sum == 0) : 
            return 1
        else : 
            return 0
    # If the state has been solved before  
    # return the value of the state  
    if (v[i][required_sum + base]) : 
        return dp[i][required_sum + base]
    # Setting the state as solved  
    v[i][required_sum + base] = 1
    # Recurrence relation  
    dp[i][required_sum + base] = findCnt(arr, i + 1, required_sum, n) + findCnt(arr, i + 1, required_sum - arr[i], n)
    return dp[i][required_sum + base]
  
arr = [ 2, 2, 2, 4 ]  
n = len(arr) 
k = 4
  
print(findCnt(arr, 0, k, n))

它给出了预期的结果,但我被要求不要使用 numpy,所以我用这样的嵌套列表替换了 numpy 数组:

#dp = np.zeros((maxN, maxSum + minSum)) replaced by
dp = [[0]*(maxSum + minSum)]*maxN
#v = np.zeros((maxN, maxSum + minSum)) replaced by
v = [[0]*(maxSum + minSum)]*maxN

但是现在程序在输出中总是给我0,我认为这是因为numpy数组和嵌套列表之间存在一些行为差异,但我不知道如何解决它

编辑:

感谢在 cmets 中提供此解决方案的 @venky__:

[[0 for i in range( maxSum + minSum)] for i in range(maxN)]

它有效,但我仍然不明白它与我之前所做的有什么区别,我尝试了:

print( [[0 for i in range( maxSum + minSum)] for i in range(maxN)] == [[0]*(maxSum + minSum)]*maxN )

结果是True,那么这是如何解决问题的呢?

【问题讨论】:

  • [[0 for i in range( maxSum + minSum)] for i in range(maxN)]
  • @venky__ 非常感谢这已经解决了问题,但是它和[[0]*(maxSum + minSum)]*maxN 有什么区别?
  • 阅读已接受答案的第一条评论。 stackoverflow.com/questions/5205575/…

标签: python arrays numpy


【解决方案1】:

事实证明,我使用嵌套列表错误的方式来表示二维数组,因为 python 没有创建单独的对象,但相同的子列表索引指的是相同的整数对象,为了更好的解释,请阅读this .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-24
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 2020-01-24
    相关资源
    最近更新 更多