Python 为什么这是一个索引错误?

Python 为什么这是一个索引错误?,python,list,tuples,string-formatting,Python,List,Tuples,String Formatting,这是我的第一篇帖子,如果之前有人回复,我很抱歉。我已经尝试浏览了关于字符串格式和列表的Python3文档,并在这里回顾了类似的格式问题 我想获取字符串(data1),将其分解为一个列表(bigData),然后使用列表项打印出一条语句。最终,我们的想法是读入一个csv文件,将其分解,然后打印出一个响应,但我已经尝试简化这个过程,因为有一个错误 data1 = "John,Doe,53.44" bigData = data1.split(",") bigData[-1] = float(bigDat

这是我的第一篇帖子,如果之前有人回复,我很抱歉。我已经尝试浏览了关于字符串格式和列表的Python3文档,并在这里回顾了类似的格式问题

我想获取字符串(data1),将其分解为一个列表(bigData),然后使用列表项打印出一条语句。最终,我们的想法是读入一个csv文件,将其分解,然后打印出一个响应,但我已经尝试简化这个过程,因为有一个错误

data1 = "John,Doe,53.44"
bigData = data1.split(",")
bigData[-1] = float(bigData[-1])

print(bigData) # test - []'s indicate a list, not tuple?

greeting = "Hello, %s %s. Your current balance is $%.2f."

print(greeting % tuple(bigData))
“你好,约翰·多伊。你目前的余额是53.44美元。”

但是,我不知道为什么下面的代码会抛出索引器,更不用说元组索引了

data1 = "John,Doe,53.44"
bigData = data1.split(",")
bigData[-1] = float(bigData[-1])

print(bigData) # test - []'s indicate a list, not tuple?

greeting = "Hello, {} {}. Your current balance is ${}."

print(greeting.format(bigData))
我猜想bigData是异构的,这意味着一个元组。如果我替换一个字符串值而不是53.44(因此data1和bigData是同构的),它会抛出相同的错误

data1 = "John,Doe,random"
bigData = data1.split(",")

print(bigData) # test - []'s indicate a list, not tuple?

greeting = "Hello, {} {}. Your current balance is {}."

print(greeting.format(bigData))
但是,如果我将原始字符串格式转换为Python2.x字符串格式,它的格式将正确无误

data1 = "John,Doe,53.44"
bigData = data1.split(",")
bigData[-1] = float(bigData[-1])

print(bigData) # test - []'s indicate a list, not tuple?

greeting = "Hello, %s %s. Your current balance is $%.2f."

print(greeting % tuple(bigData))
  • 为什么要把我的字符串转换成元组
  • 如何用Python 3编写这项工作
  • 谢谢。

    使用splat(
    *
    )解压参数(您的
    格式
    字符串需要三个参数,但您只给它一个,一个列表容器)

    此外,您可能需要:

    bigData[-1] = str(round(float(bigData[-1]), 2))
    
    该方法采用位置参数,而不是单个列表。您需要使用
    *
    运算符解压缩列表
    bigData

    data1 = "John,Doe,random"
    bigData = data1.split(",")
    
    print(bigData)  # test - []'s indicate a list, not tuple?
    
    greeting = "Hello, {} {}. Your current balance is {}."
    
    print(greeting.format(*bigData))  # here's the change
    

    你是对的,
    bigData
    是一个列表,而不是元组,
    str.split
    返回一个列表。

    我可以看出这是多么令人惊讶,尽管让我惊讶的是,回溯没有显示异常发生在
    格式的调用中

    Python的列表可以像元组一样是异构的;这是因为它们存储的常见类型是对象引用,Python中的所有东西都是对象引用。元组实际上是
    格式
    方法的参数列表,在本例中是
    (bigData,)
    。它在查找要格式化的内容时没有参数,因为您有三个
    {}
    占位符,但只有一个参数(list
    bigData
    )。您可以使用
    greeting.format(*bigData)
    解压列表并将其内容用作参数

    %
    格式设置没有遇到此错误,因为它实际上需要在正确的操作数中包含一个元组(或一个项)

    一种更为惯用和易读的方法实际上可能是转到
    csv
    模块:

    import csv, io
    data1 = "John,Doe,random"
    for row in csv.DictReader(io.StringIO(data1),
            "givenname surname balance".split()):
        greeting = "Hello, {givenname} {surname}. Your current balance is {balance}."
        print(greeting.format(**row))
    
    这使我们可以为列指定有意义的名称,包括在需要时以格式字符串对它们重新排序。我省略了浮点转换,顺便说一下,
    decimal.decimal
    可能更适合这种用法

    str.split()
    方法根据定义返回一个列表


    我想你误解了你读到的东西——异构与同质指的是元组与列表的典型用例。让所有元素的类型匹配或不匹配不会神奇地导致容器更改为其他类型

    可能您需要解压列表/元组,因为format()希望您这样做:
    greeting.format(*bigData)
    应该会有所帮助。编辑:Format将首先尝试将每个参数转换为字符串,因此它会将整个列表转换为字符串,然后抱怨参数数量不足。例如,您可以通过执行“{}.”format(bigData)看到这一点。为什么不执行
    “你好,{}{}。您当前的余额是{}。”。format(X,Y)
    ?还有,你的确切错误信息是什么?我是新来的,所以我甚至不知道拆包是件事。我给了Alexander答案,因为这就是代码工作的原因。Yann很好地解释了为什么会这样以及我在哪里感到困惑。谢谢大家!参考。下面的许多评论有助于扩展为什么它会这样工作,但这正是我所需要的。感谢您对大数据取整的建议!作为python新手,我肯定我误解了一些东西。然而,我的想法是,由于python是动态类型的,我想知道它是否假设它是一个元组,因为它是异构的。不管是什么创建了它,都显式创建了一个列表或元组(或其他类型)。次要的讽刺是:“%格式设置没有遇到这个错误,因为它实际上希望在正确的操作数中有一个序列。”而不是序列。元组<代码>“%s%s”%[1,2]
    引发一个
    类型错误
    。此外,当只有一个项目需要格式化时,它将接受一个项目元组或项目本身。感谢您提供的详细信息。我想这和格式有关,但我不明白发生了什么。此外,我同意您在格式中添加名称。这就是我想用Python3语法解决这个问题的原因之一——它读起来更清晰。