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

如何解决TypeError: int与list类型不支持+运算的问题

解决密码强度检查器中的TypeError问题

问题描述

运行密码强度检查器时,test()函数第70行执行if sum(characters) > 1触发TypeError,报错信息为:

unsupported operand type(s) for +: 'int' and 'list'

目前代码可正常统计密码长度并加分,但该报错导致后续字符类型统计逻辑无法执行。

问题根源

代码中upper_case、lower_case、special、digits都是通过列表推导式生成的整数列表(每个元素对应密码中单个字符是否属于该类型),而characters是这些列表的集合:

upper_case = ([1 if c in string.ascii_uppercase else 0 for c in option])
lower_case = ([1 if c in string.ascii_lowercase else 0 for c in option])
special = ([1 if c in string.punctuation else 0 for c in option])
digits = ([1 if c in string.digits else 0 for c in option])

characters = [upper_case, lower_case, special, digits]

sum()函数无法直接对“列表的列表”求和,因为会尝试将整数与列表相加,从而触发类型错误。我们实际需要的是统计密码包含的不同字符类型数量,而非每个字符的类型标记。

解决方案

将每个字符类型的判断逻辑改为“检查密码中是否存在至少一个该类型字符”,返回1(存在)或0(不存在)的整数,而非列表。修改后的关键代码如下:

修复后的test()函数

def test():
    # Password Checker
    option = input("请输入要检查的密码:")

    # 检查是否包含对应类型的字符,返回1表示包含,0表示不包含
    upper_case = 1 if any(c in string.ascii_uppercase for c in option) else 0
    lower_case = 1 if any(c in string.ascii_lowercase for c in option) else 0
    special = 1 if any(c in string.punctuation for c in option) else 0
    digits = 1 if any(c in string.digits for c in option) else 0

    characters = [upper_case, lower_case, special, digits]
    length = len(option)
    score = 0

    # 长度加分逻辑保留
    if length > 8:
        score += 1
    if length > 12:
        score += 1
    if length > 13:
        score += 1
    if length > 15:
        score += 1
    if length > 16:
        score += 1
    if length > 20:
        score += 1
    if length > 25:
        score += 1

    print(f"Password length is {str(length)}, adding {str(score)} points!")

    # 现在sum(characters)可以正确计算字符类型数量
    char_type_count = sum(characters)
    if char_type_count > 1:
        score += 1
    if char_type_count > 2:
        score += 1
    if char_type_count > 3:
        score += 1

    print(f"Password has {str(char_type_count)} different character types, adding {str(char_type_count - 1)} points! ")

    # 修复拼写错误并优化强度描述
    if score < 4:
        print(f"Weak {str(score)} / 7")
    elif score == 4:
        print(f"Weak {str(score)} / 7")
    elif 4 < score < 6:
        print(f"Medium {str(score)} / 7")
    elif score > 6:
        print(f"Strong {str(score)} / 7")

额外优化提示

  1. 原代码中强度描述的Week是拼写错误,已改为Weak,并补充了中等强度的描述,提升可读性。
  2. 长度判断逻辑可简化为更高效的写法,例如:
score += min(length // 8, 3) + min(max(length - 15, 0) // 5, 2) + (1 if length >25 else 0)

该优化不影响核心功能修复,可按需选用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 06:48:26