【问题标题】:Python ValueError: too many values to unpack For LoopPython ValueError:太多值无法解压 For 循环
【发布时间】:2021-01-16 16:38:22
【问题描述】:

您好,我有一个 DF,我正在尝试发送到 HTML 表。例如,这是我唯一的一行:

mdf = [('2007291533_946908J.70J.908J-06.FPP.FMGN512.rSBDl5kn9o4R4wP7dtmissbinallerrors.log', 'K946', 'nabcs', '027', 'ERROR: 2007291533_946908J.70J.908J-06.FPP.FMGN512.rSBDl5kn9o4R4wP7dtmissbinallerrors.loghas bad formatting because it has No product offset', 'C:\\Users\\error_dir\\2007291533_946908J.70J.908J-06.FPP.FMGN512.rSBDl5kn9o4R4wP7dtmissbinallerrors.log') ]

如您所见,元组中有六个项目

但是当我尝试在这个中解压它时:

for tup in mdf:
        for filename, lot, lot_owner, holder, error, location in tup:
            hlist.append(f"\n<tr><td>{filename}</td><td>{lot}</td><td>{lot_owner}</td><td>{holder}</td><td>{error}</td><td>{location}</td></tr>\n")

我得到 ValueError: too many values to unpack (expected 6)

当我在第二个 for 循环中有 6 个项目时,这怎么可能?

【问题讨论】:

    标签: python python-3.x iterable-unpacking


    【解决方案1】:

    你有一个元组列表,我猜你是在错误的级别解压它。

    这不是你需要的吗?

    for filename, lot, lot_owner, holder, error, location in mdf:
        hlist.append(f"\n<tr><td>{filename}</td><td>{lot}</td><td>{lot_owner}</td><td>{holder}</td><td>{error}</td><td>{location}</td></tr>\n")
    

    【讨论】:

    • 但是我怎么解压到错误的级别呢?第一级是每个元组的顶视图,这就是我在 mdf 中说 tup 的原因。然后第二级是从元组中提取值,所以我解压了它。为什么这是错误的?
    • 你需要一个 for 循环。第二个将遍历元组,这就是为什么你不能解压它。
    • 我还是有点摸不着头脑,但我有点明白了,谢谢!
    • 尽量不要在第二个循环上拆包打印,像这样:for tup in mdf: for t in tup: print(t)也许你能掌握!
    【解决方案2】:

    那是因为你在元组中循环。

    for item in tup:
        print(item) 
    

    元组中项目的每次迭代都会为您提供元组的每个内容。每个项目将只有一个值(第一次迭代将是您的文件名,第二次将是很多,等等)。您不能从文件名中解压缩 6 个值。

    试试

    for filename, lot, lot_owner, holder, error, location in mdf:
            hlist.append(f"\n<tr><td>{filename}</td><td>{lot}</td><td>{lot_owner}</td><td>{holder}</td><td>{error}</td><td>{location}</td></tr>\n")
    

    【讨论】:

    • 等等,但是 mdf 中的每个项目都是一个元组。为什么要在 mdf 级别(列表级别)解包元组
    • 猜猜你给出的答案和我的一样。检查 OP 是否正在解包 holder 并使用 wafer,这不起作用
    • 对不起,我的错误,我编辑了 OP 说持有人。它应该是持有人,但这不是问题。 @antonioplacerda
    • @antonioplacerda 略有不同。我建议 OP 为每个 tup 消除第二个 for 循环。是的,晶圆需要更换为支架。
    • @edo101 因为如果你这样做for tup in mdf,每个 tup 将是一个由 6 个项目组成的元组。如果你这样做for a, b, c, d, e, f in mdf,每个迭代器都已经解压了 tup 的所有 6 个内容。
    【解决方案3】:

    所以,基本上,您只需要解包元组。我觉得你说的有点太复杂了,我不知道为什么还没有人建议,但最简单的方法是:

    for tup in mdf:
        filename, lot, lot_owner, holder, error, location = tup
        hlist.append(f"\n<tr><td>{filename}</td><td>{lot}</td><td>{lot_owner}</td><td>{holder}</td><td>{error}</td><td>{location}</td></tr>\n")
    

    真的不需要第二个for 循环。

    【讨论】:

    • 其他2个答案已经建议没有第二个for循环
    • 但是用简单的赋值表达式解包元组不是。
    • 我认为如果我们谈论简单,这取决于读者。有 2 行对我来说很简单,因为我不喜欢再添加一行来分配。但偏好是主观的
    • 我喜欢您的解决方案,但我必须坦率地说,阅读起来可能会有些混乱。很清楚它在提供的示例中做了什么,我们在列表中有一个包含 6 个值的元组。但是,如果我们有多个元组,您的解决方案仍然有效,但是在这种特殊情况下,这些值是如何分配的,这可能会让人感到困惑(我当然也会感到困惑)。
    • 感谢@pavel 的掘金。更容易可视化正在发生的事情
    猜你喜欢
    • 2020-01-20
    • 2015-12-20
    • 2016-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-04
    • 2017-11-25
    • 1970-01-01
    相关资源
    最近更新 更多