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

如何在Python中对列表正确应用绝对值,避免TypeError异常

问题分析与解决

错误根源

你遇到的TypeError: bad operand type for abs(): 'list'是因为直接将列表B传入了modinv函数,而modinv调用的extended_gcd会尝试对参数bb(也就是整个列表)执行abs()操作——列表类型不支持这个运算,自然报错。另外,B中的元素是十六进制字符串,也无法直接作为整数参与模逆运算。

修正步骤

因为要求必须保留列表类型的B,需要分两步处理:

  1. 将B中的每个十六进制字符串转换为整数(注意你写的十六进制字符串包含非法字符,比如0xd4c19erfiorf434434里的r、i、o,这些不是十六进制合法字符,需要修正为0-9、a-f/A-F范围内的字符)
  2. 遍历B的每个元素,逐个计算对应的模逆与最终结果

修正后的代码

def extended_gcd(aa, bb):
    lastremainder, remainder = abs(aa), abs(bb)
    x, lastx, y, lasty = 0, 1, 1, 0
    while remainder:
        lastremainder, (quotient, remainder) = remainder, divmod(lastremainder, remainder)
        x, lastx = lastx - quotient*x, x
        y, lasty = lasty - quotient*y, y
    return lastremainder, lastx * (-1 if aa < 0 else 1), lasty * (-1 if bb < 0 else 1)

def modinv(a, m):
    g, x, y = extended_gcd(a, m)
    if g != 1:
        raise ValueError("a和m不互质,不存在模逆元")
    return x % m

# 修正N的十六进制格式(原格式包含非法字符,替换为合法十六进制)
N = 0x00249D0F994924942323
A = 0x0000000000024224234234
# 修正B中的十六进制字符串为合法格式
B = ["0xd4c19E7F0F434434", "0xd4c19E8F1F434434"]

# 遍历列表B,逐个计算结果
def h(val):
    # 这里补充h函数的实现,示例返回字符串形式
    return hex(val)

for b_str in B:
    # 将十六进制字符串转为整数
    b = int(b_str, 16)
    try:
        inv_b = modinv(b, N)
        result = (A * inv_b) % N
        print(h(result))
    except ValueError as e:
        print(f"处理{b_str}时出错: {e}")

关于你尝试的map(abs(bb))的问题

你的用法有误,map的正确语法是map(函数, 可迭代对象),比如map(abs, bb),但这解决不了根本问题:因为bb是字符串列表,abs()无法处理字符串,而且你需要的是先将字符串转整数,再针对每个整数计算模逆,而不是对列表本身取绝对值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 10:39:16