列表推导式中能否显式指定类型?及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
相关产品推荐
相关产品推荐

