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

列表推导式中能否显式指定类型?及TypeError问题排查

问题:列表推导式重构代码后出现TypeError错误

原代码通过循环读取输入并转换类型后创建Participant实例,改用列表推导式重构后,执行quicksort函数时出现TypeError: bad operand type for unary -: 'str',想确认是否可以在列表推导式中显式指定类型来解决该问题。

原代码

def main():
    n = int(input())
    array = []
    for _ in range(n):
        login, solved, penalties = input().split()
        array.append(
            Participant(login, int(solved), int(penalties))
        )
    quicksort(array, 0, n-1)
    for i in array:
        print(i.login)

重构后代码

def main():
    n: int = int(input())
    array: List[Participant] = [
        Participant(*sys.stdin.readline().split()) for _ in range(n)
    ]
    result: List[Participant] = quicksort(array, 0, n - 1)
    print(*result, sep="\n")

完整代码

from dataclasses import dataclass
import sys
from typing import List


@dataclass
class Participant:
    login: str
    solved: int
    penalties: int

    def __lt__(self, other):
        return (
            (-self.solved, self.penalties, self.login)
            < (-other.solved, other.penalties, other.login)
        )


def quicksort(array: list, left: int, right: int):
    if left >= right:
        return
    i, j = left, right
    pivot = array[(left + right) // 2]
    while i <= j:
        while array[i] < pivot:
            i += 1
        while array[j] > pivot:
            j -= 1
        if i <= j:
            array[i], array[j] = array[j], array[i]
            i, j = i + 1, j - 1

    quicksort(array, left, j)
    quicksort(array, i, right)


def main():
    n: int = int(input())
    array: List[Participant] = [
        Participant(*sys.stdin.readline().split()) for _ in range(n)
    ]
    result: List[Participant] = quicksort(array, 0, n - 1)
    print(*result, sep="\n")

if __name__ == '__main__':
    main()

错误原因分析

问题和类型注解无关。Python的类型注解只是静态提示,不会自动转换变量类型。

原循环代码中,你明确将solved和penalties用int()转换为整数后传入Participant;但重构后的列表推导式里,直接把sys.stdin.readline().split()返回的字符串列表解包传给Participant,导致Participant实例的solved和penalties属性实际是字符串类型。当__lt__方法执行-self.solved时,自然会报错——字符串不能执行一元负号操作。

解决方案

必须在列表推导式里显式将solved和penalties转换为整数,而不是依赖类型注解。同时注意:quicksort函数是原地排序,没有返回值,不能将它的调用结果赋值给result,直接排序后遍历原数组即可。

修正后的main函数代码(列表推导式版本):

def main():
    n: int = int(input())
    array: List[Participant] = [
        Participant(parts[0], int(parts[1]), int(parts[2]))
        for parts in [sys.stdin.readline().split() for _ in range(n)]
    ]
    quicksort(array, 0, n - 1)
    for participant in array:
        print(participant.login)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 17:10:24