scores = list(map(int, parts[1:])) ValueError: invalid literal for int() with base 10: 'C语言'
时间: 2024-11-20 10:30:26 浏览: 4
在处理文档内容时,出现了一个 `ValueError` 错误,原因是尝试将非数字字符串(如 "C语言")转换为整数。具体来说,代码 `scores = list(map(int, parts[1:]))` 尝试将 `parts` 列表中的每个元素从索引 1 开始转换为整数,但遇到了无法转换的字符串。
为了修复这个问题,可以先过滤掉非数字字符串,然后再进行转换。以下是一个示例代码:
```python
parts = ["专业", "C语言", "Java", "Python", "C#", "Javascript", "软件工程", "9596856391", "计算机科学与技术", "7593668588", "网络工程", "8676969367"]
# 过滤掉非数字字符串
filtered_parts = [part for part in parts[1:] if part.isdigit()]
# 转换为整数列表
scores = list(map(int, filtered_parts))
print(scores)
```
这样,`filtered_parts` 只会包含可以转换为整数的字符串,从而避免 `ValueError` 错误。输出结果将是:
```
[9596856391, 7593668588, 8676969367]
```
相关问题
class Student: def __init__(self): self.age = None self.gender = None self.scores = {'Chinese': None, 'Math': None, 'English': None} def set_age(self, age): if not isinstance(age, int) or age < 0: raise ValueError('Invalid age') self.age = age def set_gender(self, gender): if gender not in ['male', 'female']: raise ValueError('Invalid gender') self.gender = gender def set_score(self, subject, score): if subject not in self.scores: raise ValueError('Invalid subject') if not isinstance(score, int) or score < 0 or score > 100: raise ValueError('Invalid score') self.scores[subject] = score # 主函数 try: s = Student() age = int(input('请输入学生年龄:')) s.set_age(age) gender = input('请输入学生性别(male或female):') s.set_gender(gender) for subject in ['Chinese', 'Math', 'English']: score = int(input(f'请输入{subject}成绩:')) s.set_score(subject, score) print('学生信息设置成功!') except ValueError as e: print('学生信息设置失败:', e)
这段代码已经很简洁和易读了,但还有一些可以进行优化的地方:
1. 可以使用 `@property` 装饰器和 `@setter` 装饰器来简化代码,使得调用更加方便。
2. 可以在 `set_score` 函数中使用一个字典,将科目名称与对应的分数作为键值对存储,这样可以减少代码重复。
3. 可以在输入时对数据进行校验,如果输入的不是数字或者不在指定范围内,可以直接提示输入错误,而不是在 `set_score` 函数中在进行校验。
以下是经过优化的代码:
```python
class Student:
def __init__(self):
self._age = None
self._gender = None
self._scores = {'Chinese': None, 'Math': None, 'English': None}
@property
def age(self):
return self._age
@age.setter
def age(self, value):
if not isinstance(value, int) or value < 0:
raise ValueError('Invalid age')
self._age = value
@property
def gender(self):
return self._gender
@gender.setter
def gender(self, value):
if value not in ['male', 'female']:
raise ValueError('Invalid gender')
self._gender = value
@property
def scores(self):
return self._scores
def set_score(self, subject, score):
if subject not in self._scores:
raise ValueError('Invalid subject')
self._scores[subject] = score
def input_score(subject):
while True:
try:
score = int(input(f'请输入{subject}成绩:'))
if score < 0 or score > 100:
print('分数必须在0-100之间')
continue
return score
except ValueError:
print('请输入数字')
# 主函数
try:
s = Student()
s.age = int(input('请输入学生年龄:'))
s.gender = input('请输入学生性别(male或female):')
for subject in ['Chinese', 'Math', 'English']:
score = input_score(subject)
s.set_score(subject, score)
print('学生信息设置成功!')
except ValueError as e:
print('学生信息设置失败:', e)
```
经过优化后,代码更加简洁易读,使用 `@property` 装饰器和 `@setter` 装饰器来简化了代码,将检验数据类型和数据范围的代码放在了输入函数中,使得代码结构更加清晰。
n=int(input()) for i in range(n): scores=map(int,input().split()) print(max(scores))优化缩短运行时间
你可以使用列表解析式来取代 for 循环,同时使用内置函数 map() 和 max(),将代码简化为一行:
```python
print(*[max(map(int, input().split())) for _ in range(int(input()))])
```
这样可以减少循环次数和代码行数,从而优化缩短运行时间。
阅读全文