【问题标题】:Why does "TypeError: cannot unpack non-iterable int object" occur when trying to unpack tuples?为什么在尝试解包元组时会出现“TypeError: cannot unpack non-iterable int object”?
【发布时间】:2021-07-27 08:23:32
【问题描述】:

我有这个代码:

list1 = [(1, 2), (3, 4, 5), (6, 7, 8, 9), (10, 11)]

for tup_obj in list1:
    if len(tup_obj) == 2:
        for a, b in tup_obj:
            print(a)
            print(b)
    elif len(tup_obj) == 3:
        for a, b, c in tup_obj:
            print(a)
            print(b)
            print(c)
    elif len(tup_obj) == 4:
        for a, b, c, d in tup_obj:
            print(a)
            print(b)
            print(c)
            print(d)

我需要解压列表中的元组

list1 = [(1, 2), (3, 4, 5), (6, 7, 8, 9), (10, 11)]

它由具有不同数量元素的元组组成。

我正在尝试获取列表中的每个项目(即,除了元组之外什么都没有),一旦选择它,我想检查该元组中有多少元素(例如,在第一种情况下,数字元组中的元素是 2)。

这是我使用内置的len 函数完成的。因此,如果是两个,我将取值作为a, b,如果选定的元组包含 3 或 4 个元素,则意味着我将变量取为 a, b, c 或 a, b, c, d。但是一旦这一步完成,它就说明它不能解压不可迭代的 int 对象。但我不知道为什么。

【问题讨论】:

  • 你确定你的意思是像for a, b in tup_obj: 那样迭代吗?看来你只是想分配每个 tup 值,这将作为 a, b = tup_obj 完成
  • 请添加堆栈跟踪。

标签: python for-loop if-statement tuples


【解决方案1】:

正如 cmets 中指出的,您应该这样做:

for tup_obj in list1:
    if len(tup_obj) == 2:
        a, b = tup_obj
        print(a)
        print(b)
# ...

但整个复杂的结构似乎没有必要。为什么不只是:

for tup_obj in list1:
    for a in tup_obj:
        print(a)

这将动态涵盖所有情况。

【讨论】:

  • 如果你想拥有这样的数据结构,这就是要走的路。
【解决方案2】:

根据您的代码,您似乎希望将元组值分配给 a、b....等,而不是遍历元组。

当你说 for a, b in tup_obj 这将把你的元组说成 (1,2)。它将获取第一项 1,然后尝试将其解压缩为两个变量 a 和 b,但您无法将单个 int 解压缩为两个变量。

所以你可能只想将元组中的每个值分配给它自己的变量

list1 = [(1, 2), (3, 4, 5), (6, 7, 8, 9), (10, 11)]

for tup_obj in list1:
    if len(tup_obj) == 2:
        a, b = tup_obj
        print(a)
        print(b)
    elif len(tup_obj) == 3:
        a, b, c = tup_obj
        print(a)
        print(b)
        print(c)
    elif len(tup_obj) == 4:
        a, b, c, d = tup_obj
        print(a)
        print(b)
        print(c)
        print(d)

但是,正如您所看到的那样,这并不能很好地扩展,因为您必须为每个元组长度编写代码并重复您自己,因此您可能需要重新考虑您的方法

【讨论】:

    【解决方案3】:
    list1 = [(1, 2), (3, 4, 5), (6, 7, 8, 9), (10, 11)]
    
    for tup_obj in list1:
        if len(tup_obj) == 2:
            a,b = tup_obj
            print(a,b)
        elif len(tup_obj) == 3:
            a,b,c = tup_obj
            print(a,b,c)
        elif len(tup_obj) == 4:
            a,b,c,d = tup_obj
            print(a,b,c,d)
    

    【讨论】:

      猜你喜欢
      • 2021-11-27
      • 2022-01-05
      • 1970-01-01
      • 2020-08-26
      • 2021-09-24
      • 2021-01-27
      • 1970-01-01
      • 1970-01-01
      • 2023-01-04
      相关资源
      最近更新 更多