我刚开始学习Python,想要创建一个简单的脚本,从用户输入读取整数并打印它们的总和。
我写的代码是
inflow = list(map(int, input().split(" ")))
result = 1
for i in inflow:
result += inflow[i]
print(result)
它给了我一个错误
IndexError:列表索引超出范围
指向result += inflow[i]
行。无法看到我做错了什么?
答案 0 :(得分:4)
你也可以完全避免循环:
inflow = '1 2 34 5'
然后
sum(map(int, inflow.split()))
将给出预期值
42
编辑:
当您使用1而不是0初始化结果时,您可以简单地执行:
sum(map(int, input.split()), 1)
我的回答是假设输入始终有效。如果要捕获无效输入,请选中Anton vBR's answer。
答案 1 :(得分:2)
考虑:我刚开始学习Python
我建议这样做,处理输入错误:
inflow = raw_input("Type numbers (e.g. '1 3 5') ") #in py3 input()
#inflow = '1 2 34 5'
try:
nums = map(int, inflow.split())
result = sum(nums)
print(result)
except ValueError:
print("Not a valid input")
答案 2 :(得分:1)
for i in list
给出列表的值,而不是索引。
inflow = list(map(int, input().split(" ")))
result = 1
for i in inflow:
result += i
print(result)
如果您想要索引而不是值:
inflow = list(map(int, input().split(" ")))
result = 1
for i in range(len(inflow)):
result += inflow[i]
print(result)
最后,如果你想要两个:
for index, value in enumerate(inflow):
答案 3 :(得分:1)
脚本,它将从用户输入中读取整数并打印它们 总和。
试试这个:
{{1}}
答案 4 :(得分:1)
如果您要对列表对象编制索引,请执行以下操作:
for i in range(len(inflow)):
result += inflow[i]
但是,您已经映射int
并将map
对象转换为list
,因此您可以迭代它并添加其元素:
for i in inflow:
result += i
至于你的第二个问题,因为你没有在演员表上进行任何类型测试(例如,如果用户提供3.14159
会发生什么;在这种情况下int()
代表一个str
float
抛出一个ValueError
),你可以把它全部包起来:
inflow = [int(x) for x in input().split(' ')] # input() returns `str` so just cast `int`
result = 1
for i in inflow:
result += i
print(result)
为了安全并确保输入有效,我会在构建具有上述列表理解的列表之前添加一个测试类型转换的函数:
def typ(x):
try:
int(x)
return True # cast worked
except ValueError:
return False # invalid cast
inflow = [x for x in input().split(' ') in typ(x)]
result = 1
for i in inflow:
result += i
print(result)
因此,如果用户提供'1 2 3 4.5 5 6.3 7'
,inflow = [1, 2, 3, 5, 7]
。
答案 5 :(得分:0)
您的代码按时间顺序执行的操作是:
inflow
result
初始化为1 inflow
中的每个项目进行迭代,并将项目设置为i
i
添加到result
并继续破坏的逻辑将在第4步。
要回答您的问题,问题是您没有按预期从列表中收集索引 - 您正在迭代列表中的每个值索引,所以它根据用户输入的内容确实是未定义的行为。当然,它并不是你想要的。
您想要做的是:
inflow = list(map(int, input().split(" ")))
result = 1
for i in range(len(inflow)):
result += inflow[i]
print(result)
在你最后的关注;有两种真正的方法可以做到这一点,一种是你现在使用list,map和现在做的方式:
inflow = [int(v) for v in input().split()]
IMO后者看起来更好。也是一个建议;你可以在一个整数或浮点数列表上调用stdlib函数sum(<iterable>)
,它会添加每个数字并返回总和,这在for
循环上看起来更干净。
注意:如果您按空格分割,则可以在没有任何参数的情况下调用str.split()
函数,因为它会在每个空格处分割,无论如何。
>>> "hello world!".split()
['hello', 'world!']
注意:如果你想要额外的验证,你可以为列表理解添加更多的逻辑:
inflow = [int(v) for v in input().split() if v.isdigit()]
检查用户是否输入了有效数据,如果没有,则跳过数据并检查以下内容。