Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从JavaScript到Python的子集求和算法转换_Javascript_Python_Python 3.x_List - Fatal编程技术网

从JavaScript到Python的子集求和算法转换

从JavaScript到Python的子集求和算法转换,javascript,python,python-3.x,list,Javascript,Python,Python 3.x,List,我有以下JavaScript代码来计算数组中的最小元素,其和等于n: function findMinSum(arr, n){ if(!arr) return let min for (let i=0; i<arr.length; i++) { /* if a number equals the sum, it's obviously * the shortest set, just return it */

我有以下JavaScript代码来计算数组中的最小元素,其和等于
n

function findMinSum(arr, n){
    if(!arr) return 
    let min 
    for (let i=0; i<arr.length; i++) {

        /* if a number equals the sum, it's obviously
         * the shortest set, just return it
         */
        if (arr[i] == n) return [arr[i]]     

        /* recursively call on subset with
         * sum adjusted for removed element 
         */
        let next = findMinSum(arr.slice(i+1), n-arr[i])

        /* we only care about next if it's shorter then 
         * the shortest thing we've seen so far
         */
        if (next){
            if(min === undefined || next.length < min.length){
                min = [arr[i], ...next]
            }
        }
    }
    return min && min  /* if we found a match return it, otherwise return undefined */
}
函数findMinSum(arr,n){
如果(!arr)返回
让敏
for(设i=0;i

我想将其转换为Python,因此我做了以下工作:

def findMinSum(arr, n):
    if not arr:
        return

    min = []
    min_len = len(min)
    for i in range(0, len(arr)):

        if(arr[i] == n):
            return (arr[i])

        next = []
        next = findMinSum(arr[i+1:], n-arr[i])

        if(next == list):
            next_len = len(next)
        else:
            next_len = next

        if(next):
            print(next) # printing next for debugging purpose 
            if( ( not min ) or (next_len < min_len) ):
                min = [ next, arr[i]]

    return min

arr = [8, 6, 1, 5, 9, 3]
get_min = findMinSum(arr, 14)

print(get_min)

def findMinSum(arr,n):
如果没有arr:
返回
最小值=[]
最小长度=最小长度(最小)
对于范围(0,len(arr))内的i:
如果(arr[i]==n):
返回(arr[i])
下一步=[]
next=findMinSum(arr[i+1:],n-arr[i])
如果(下一个==列表):
next_len=len(next)
其他:
下一个
如果(下一个):
打印(下一页)#打印下一页用于调试
如果((非最小值)或(下一个<最小值)):
min=[next,arr[i]]
返回最小值
arr=[8,6,1,5,9,3]
get_min=findMinSum(arr,14)
打印(获取最小值)
但当我运行此代码时,会出现以下错误:

3
[3, 1]
9
[[3, 1], 6]
3.
[3, 9]
回溯(最近一次呼叫最后一次):
文件“test1.py”,第34行,在
min2=findMinSum(arr,14)
findMinSum中第25行的文件“test1.py”
如果((非最小值)或(下一个<最小值)):

TypeError:“这里有各种各样的问题

  • 永远不要覆盖内置代码。Python定义了
    min
    next
    list
    。如果覆盖它们,可能会遇到非常微妙的错误
  • Python没有数组,它有列表。从不缓存对
    len
    的调用——此代码不会更新
    min\u len=len(min)
    ,因此如果
    min
    被更新,则该值在以后的循环比较中是过时的
  • 避免在条件语句和返回语句周围使用不必要的括号,因为括号用于创建元组。
    return(arr[i])
    应该是
    return[arr[i]]
    (单个元素列表)
  • min=[next,arr[i]]
    [arr[i],…next]
    在排序或解包/摊铺时不匹配。使用
    min=[arr[i],*next]
    展平
    next
  • JS和Python对未定义的
/
和布尔数组/列表值的处理方式不同。JS将空数组视为真数组,而Python将空列表视为假数组。
min=[]
不会捕获隐式设置
min=undefined
的原始JS代码,因此
if not min
会检查
min
是否为null或空,这与原始JS版本不可比
  • 无需检查类型;检查
    非无
    即可
  • if(next){if(more-stuff…
    可以使用
    只包含一个块。没有理由嵌套(这在原始版本中是个问题)
  • 在大多数情况下(如果使用范围,
    range(0,len(some_list))
    可以是
    range(len(some_list))
    ,而不是
    range
  • 遵守。函数和变量名使用
    snake\u case
  • 这是我的回信:

    def find_smallest_sum(lst, n):
        if not lst:
            return None
    
        smallest = None
    
        for i, e in enumerate(lst):
            if e == n:
                return [e]
    
            next_lst = find_smallest_sum(lst[i+1:], n - e)
    
            if next_lst is not None and (smallest is None or len(next_lst) < len(smallest)):
                smallest = [e, *next_lst]
    
        return smallest
    
    if __name__ == "__main__":
        print(find_smallest_sum([10, 0, -1, 20, 25, 30], 59))  # => [10, -1, 20, 30]
        print(find_smallest_sum([8, 6, 1, 5, 9, 3], 14))       # => [5, 9]
    
    def find_minimable_sum(lst,n):
    如果不是lst:
    一无所获
    最小=无
    对于枚举中的i,e(lst):
    如果e==n:
    返回[e]
    下一个=找到最小的和(lst[i+1:],n-e)
    如果next_lst不是None且(最小值是None或len(next_lst)[10,-1,20,30]
    打印(查找最小的总和([8,6,1,5,9,3],14))#=>[5,9]
    
    欢迎使用SO!如果(下一个==列表):
    中的
    列表是什么?
    ?建议不要使用
    列表
    下一个
    或其他内置变量名。另外,跳过
    ()
    s在Python中用于条件和返回值。您可能会意外地生成元组。@ggorlen谢谢!我正在检查next是否是列表。此外,我尝试更改变量名,但仍然得到相同的输出。这不起作用-您希望
    isinstance
    在此处键入
    。是的,
    next
    是一个迭代或者函数,所以我只是写一个一般性的注释,而不是一个解决方案。缓存
    len
    调用也是一种不好的做法,这可能是原因:
    min\u len=len(min)
    。当
    min
    发生更改时,此项不会更新。
    min
    也会覆盖内置函数
    min
    。顺便说一句,答案不是6、9、3吗?@ggorlen感谢您的建议,我将尝试在代码中实现它们。