“元组索引超出范围”错误?

时间:2016-09-27 23:09:36

标签: python tuples

我不确定我在这里做错了什么,有人知道吗?我一直收到一个错误,上面写着“元组索引超出范围”。我正在学习一个学校的教程,我似乎正在做一切正确,但我不断收到这个错误。任何帮助,将不胜感激!非常感谢你。

animal = input("Enter any LARGE animal: ")
smallAnimal = input("Enter any SMALL animal: ")
weapon = input("Enter a sharp weapon: ")

def createDictionary():

    storyDict = dict()
    storyDict['animal'] = animal
    storyDict['smallAnimal'] = smallAnimal
    storyDict['weapon'] = weapon

return storyDict

def main():

    dictionary = createDictionary()

    animalFormat = """Once upon a time, there was a very, very large {animal}. This {animal} was the meanest, baddest, most gruesome {animal} there     was. And one day, a wild {1} had
    stepped on the {animal}'s foot. At that moment, the {1} knew it had messed up. This made the {animal} angry, so he took a {weapon} and STABBED the 
    {smallAnimal}with it! The {smallAnimal} squirmed and fought to get out, but it was no match for the {animal} with a {weapon}.

    The End."""

    withSubstitutions = animalFormat.format(**dictionary)
    print(withSubstitutions)


main()

3 个答案:

答案 0 :(得分:0)

在animalFormat中,替换:

{1}

使用:

{smallAnimal}

此更改必须在两个地方进行。

由于您要向format提供包含关键字的参数,因此1无需参考。

更简单的例子

观察这是有效的:

>>> d = {'a':1, 'b':2}
>>> 'Twice {a} is {b}'.format(**d)
'Twice 1 is 2'

但这不起作用:

>>> 'Twice {1} is {b}'.format(**d)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: tuple index out of range

如果您向format提供关键字参数,则1无需参考。

可以提供位置参数和关键字参数。例如:

>>> 'Twice {1} is {b}'.format('Arg0', 'ArgOne', **d)
'Twice ArgOne is 2'

完整的工作代码

animal = input("Enter any LARGE animal: ")
smallAnimal = input("Enter any SMALL animal: ")
weapon = input("Enter a sharp weapon: ")

def createDictionary():

    storyDict = dict()
    storyDict['animal'] = animal
    storyDict['smallAnimal'] = smallAnimal
    storyDict['weapon'] = weapon

    return storyDict

def main():

    dictionary = createDictionary()

    animalFormat = """Once upon a time, there was a very, very large {animal}. This {animal} was the meanest, baddest, most gruesome {animal} there     was. And one day, a wild {smallAnimal} had
    stepped on the {animal}'s foot. At that moment, the {smallAnimal} knew it had messed up. This made the {animal} angry, so he took a {weapon} and STABBED the_
    {smallAnimal}with it! The {smallAnimal} squirmed and fought to get out, but it was no match for the {animal} with a {weapon}.

    The End."""

    withSubstitutions = animalFormat.format(**dictionary)
    print(withSubstitutions)


main()

示例运行:

Enter any LARGE animal: Lion
Enter any SMALL animal: Mouse
Enter a sharp weapon: knife
Once upon a time, there was a very, very large Lion. This Lion was the meanest, baddest, most gruesome Lion there     was. And one day, a wild Mouse had
    stepped on the Lion's foot. At that moment, the Mouse knew it had messed up. This made the Lion angry, so he took a knife and STABBED the 
    Mousewith it! The Mouse squirmed and fought to get out, but it was no match for the Lion with a knife.

    The End.

答案 1 :(得分:0)

您正在按关键字和有序数据混合格式化字符串。

MCVE:

s = "{0}{k}".format(k='something')

例外:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: tuple index out of range

由于您的模板包含有序参数({1})的占位符,因此您需要将它们传递给您的函数:

animalFormat = """Once upon a time, there was a very, very large {animal}. This {animal} was the meanest, baddest, most gruesome {animal} there     was. And one day, a wild {1} had
stepped on the {animal}'s foot. At that moment, the {1} knew it had messed up. This made the {animal} angry, so he took a {weapon} and STABBED the 
{smallAnimal}with it! The {smallAnimal} squirmed and fought to get out, but it was no match for the {animal} with a {weapon}.

The End."""

d = {'animal': 'X', 'smallAnimal': 'Y', 'weapon': 'Z'}
a = ['A', 'B']  # placeholder
animalFormat.format(*a, **d)  # works fine

答案 2 :(得分:0)

此错误是因为您有命名替换(例如.. very large {animal} ..)以及位置替换(例如At that moment, the {1} knew ..)。< / p>

考虑传递类似的内容:

animalFormat.format("Replacement for {0}", "Replacement for {1}", **dictionary)

在上述情况下,替代的位置部分将为:

At the moment, the Replacement for {1} knew ..