You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python列表两数之和函数:如何将返回None改为空列表?

问题

需求:实现函数sum_of_two(L, s),从列表L中找出两个数之和等于目标值s,仅可使用集合、数组、列表,不可使用字典;若找不到符合条件的数对,需返回空列表。

我编写的代码在找不到数对时返回None,尝试用if语句处理但无效,不确定是不是None类型的问题。

尝试的代码

def sum_of_two(L,s):
     for item in L:
         arr = L[:]
         arr.remove(item)
         if s - item in arr:
             sOfTwo = [item, s-item]
             if sOfTwo is None:
                 return []
             else:
                 return sOfTwo

测试输出

L= [1, 2, 5, 14, 6, 7, 8]
s = 0    sum_of_two(L,s) = None
s = 1    sum_of_two(L,s) = None
s = 2    sum_of_two(L,s) = None
s = 3    sum_of_two(L,s) = [1, 2]
s = 4    sum_of_two(L,s) = None
s = 5    sum_of_two(L,s) = None
s = 6    sum_of_two(L,s) = [1, 5]
s = 7    sum_of_two(L,s) = [1, 6]
s = 8    sum_of_two(L,s) = [1, 7]
s = 9    sum_of_two(L,s) = [1, 8]
s = 10    sum_of_two(L,s) = [2, 8]
s = 11    sum_of_two(L,s) = [5, 6]
s = 12    sum_of_two(L,s) = [5, 7]
s = 13    sum_of_two(L,s) = [5, 8]
s = 14    sum_of_two(L,s) = [6, 8]
s = 15    sum_of_two(L,s) = [1, 14]
s = 16    sum_of_two(L,s) = [2, 14]
s = 17    sum_of_two(L,s) = None
s = 18    sum_of_two(L,s) = None
s = 19    sum_of_two(L,s) = [5, 14]
s = 20    sum_of_two(L,s) = [14, 6]
s = 21    sum_of_two(L,s) = [14, 7]
s = 22    sum_of_two(L,s) = [14, 8]
s = 23    sum_of_two(L,s) = None
s = 24    sum_of_two(L,s) = None
s = 25    sum_of_two(L,s) = None
s = 26    sum_of_two(L,s) = None
s = 27    sum_of_two(L,s) = None

问题分析与修复

问题根源

  1. 原代码仅在找到符合条件的数对时返回结果,遍历完所有元素都没找到匹配项时,函数会默认返回None——这是Python函数的特性,无return语句时默认返回None。
  2. 代码中if sOfTwo is None的判断完全无效:sOfTwo是直接赋值的列表[item, s-item],永远不可能为None,这个逻辑纯粹多余。

修复后的代码

基础修复版(保留原逻辑)

def sum_of_two(L, s):
    for item in L:
        arr = L[:]
        arr.remove(item)
        if s - item in arr:
            return [item, s - item]
    # 遍历完所有元素都没找到,返回空列表
    return []

优化版(用集合提升效率)

如果列表中没有重复元素,或者需要处理自身相加的情况(比如s=4,列表中有两个2),可以用集合优化查找效率:

def sum_of_two(L, s):
    num_set = set(L)
    for item in L:
        complement = s - item
        if complement in num_set:
            # 处理自身相加的边界情况:确保列表中至少有两个该元素
            if complement == item and L.count(item) < 2:
                continue
            return [item, complement]
    return []

修复说明

  • 移除了无效的if sOfTwo is None判断,简化代码逻辑。
  • 在循环结束后添加return [],确保找不到匹配数对时返回空列表,而非默认的None。
  • 优化版使用集合的O(1)查找特性,比原代码的列表查找(O(n))效率更高,同时处理了元素自身相加的特殊情况。

内容的提问来源于stack exchange,提问作者hii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 10:01:43