列表索引在简单的Python脚本中超出范围

时间:2017-10-07 21:13:56

标签: python list

我刚开始学习Python,想要创建一个简单的脚本,从用户输入读取整数并打印它们的总和。

我写的代码是

inflow = list(map(int, input().split(" ")))
result = 1
for i in inflow:
    result += inflow[i]
print(result)

它给了我一个错误

  

IndexError:列表索引超出范围

指向result += inflow[i]行。无法看到我做错了什么?

BTW,是否有更优雅的方法将输入流分割为整数列表?

6 个答案:

答案 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)

您的代码按时间顺序执行的操作是:

  1. 收集用户输入,按空格拆分并转换为整数,最后存储在inflow
  2. result初始化为1
  3. inflow中的每个项目进行迭代,并将项目设置为i
  4. 将当前项i添加到result并继续
  5. 完成循环后,打印结果总计。
  6. 破坏的逻辑将在第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()]
    

    检查用户是否输入了有效数据,如果没有,则跳过数据并检查以下内容。