【问题标题】:Python - step through list -TypeError: 'int' object is not iterablePython - 逐步遍历列表 -TypeError:'int' 对象不可迭代
【发布时间】:2014-02-08 10:51:15
【问题描述】:

想学python,我在努力做:

list0=['A','B'];
list1=['C','D'];
z=0
while z < 2:
    for q in list(z):
        print q
    z += 1

我想打印出来

A
B
C
D

但我收到以下错误:

Traceback (most recent call last):
  File "main.py", line 6, in 
    for q in list(z):
TypeError: 'int' object is not iterable

这在 python 中可能吗?我知道我已经用其他语言做过这个或类似的事情。

【问题讨论】:

  • 请注意,这里的行尾不需要;。它不是 PHP 或您可能来自的任何语言。 ;) 为了完美起见,PEP8 告诉您应该在 = 周围放置空格(除非用作参数 - 您稍后会看到)和其他运算符(+- 等) .
  • 在将其用作函数之前,我看不到您的代码中声明的变量list。我认为您的意图是使用 list0[z]list1[z]

标签: python list for-loop int iterable


【解决方案1】:
  1. 您可以将两个列表收集为另一个列表,然后您可以像这样索引它

    list0=['A','B']           # We don't need semicolons
    list1=['C','D']
    lists=[list0, list1]      # Create a list of lists
    z=0
    while z < 2:
        for q in lists[z]:    # We access list's index with [], not with ()
            print q
        z += 1
    

    输出

    A
    B
    C
    D
    
  2. 这样可以达到同样的效果

    for current_list in [list0, list1]:
        for current_item in current_list:
            print current_item
    
  3. 有一个内置的python模块,自带itertools.chain方法,可以这样使用

    import itertools
    for current_item in itertools.chain(list0, list1):
        print current_item
    

【讨论】:

    【解决方案2】:

    与您尝试做的最相似的想法是创建一个由您拥有的 2 个列表组成的列表。因此,您可以通过lists[index] 形式的索引(0 or 1)访问每个列表

    lists = [['A', 'B'], ['C', 'D']]
    z = 0
    while z < 2:
        for q in lists[z]:
            print q
        z += 1
    

    请注意,list 不是一个好的变量名称,因为它对 Python 隐藏了 list 类型。

    【讨论】:

      【解决方案3】:

      list 需要一个可迭代对象作为参数。你用整数调用它

      【讨论】:

        【解决方案4】:

        我认为没有人提到的一点是list 是 Python 中的内置方法。如果你做了list("abcdefg"),你会得到['a','b','c','d','e','f','g']——你传递给list的迭代中所有元素的列表。因此,当您执行for q in list(z) 时,我知道您正在尝试执行for q in list1for q in list2,但是您正在执行for q in list(1),它试图迭代数字1——这是不可能的,这就是为什么你会收到TypeError

        如果你对使用这个特定的实现感到厌烦(相信我,你真的应该按照其他答案的建议列出一个列表),请改为:

        list0 = ["A","B"]
        list1 = ["C","D"]
        for i in range(2): #which is a generator that yields 0 and 1
            for q in vars()["list{}".format(i)]:
                print(q)
        

        vars() 是一个内置函数,它返回一个字典,其键是所有本地可用的字符串形式的变量,其值是存储在这些变量中的值。现在,您无需在数字上调用内置方法 list,而是使用 string formatting 构建与您正在使用的列表相对应的字符串。

        也就是说,每当您尝试使用变量名来包含数据时,您实际上只是在拼凑代码。尝试将其编织得更优雅,而不是依靠代码生成变量名以进行迭代:)

        为了完整起见,您应该这样做!

        a_list = ["A","B"]
        b_list = ["C","D"]
        lists = a_list+b_list #lists == ["A","B","C","D"]
        # could also do lists = [element for element in list_ for list_ in [a_list,b_list]]
        # but why in the heck should we complicate things?? May be useful if you need to
        # filter elements for whatever reason. Maybe only uppercase letters make it through?
        # so something like:
        # c_list = ["e","F"]
        # lists = [e for e in list_ for list_ in [a_list,b_list,c_list] if e.isupper()]
        # I dunno, just throwing it out there for your bag of tricks!
        for item in lists:
            print(item)
        

        或者,如果您有大量可迭代项,不一定只是支持连接运算符的列表,

        list0 = ["A","B"]
        ...
        list99 = ["Y","Z"]
        
        lists = [list0, ... , list99]
        for iterable in list:
            for element in iterable:
                print(element)
        

        【讨论】:

        • 这篇文章滥用了 KISS 命令(保持简单愚蠢)。 vars() ?!对初学者的非常糟糕的建议
        【解决方案5】:

        首先,如果每行只有一条语句,则无需在 Python 中使用分号。所以在你的代码示例中:

        list0=['A','B'];
        list1=['C','D'];
        

        应该只是:

        list0=['A','B']
        list1=['C','D']
        

        请注意,您的语法是正确的,但不需要这两个尾分号。如果你想在同一行声明两个列表那么你可以使用分号:

        list0=['A','B']; list1=['C','D']
        

        但是,不建议这样做。

        其次,在您的代码中,不需要单独的计数器z,您可以简单地将列表在一起,然后打印它们:

        for letter in list0 + list1:
            print letter
        

        作为演示:

        >>> list0=['A','B']; list1=['C','D']
        >>> for letter in list0 + list1:
        >>>     print letter
        ...     
        A
        B
        C
        D
        

        现在让我解释一下你遇到的错误:

        'int' object is not iterable
        

        当你想在 python 中创建一个list 时,你需要给构造函数一个可迭代的对象(一个可以循环的对象,就像一个数组),当你给它一个简单的数字时,它会给你一个错误,所以你可以像这样创建一个列表:

        >>> var = list([1,2,3,4])
        >>> type(var)
        <type 'list'>
        

        但你甚至不需要这样做,你可以把东西放在[]s 中,这也会为你创建 ea 列表:

        >>> var2 = [1,2,3,4]
        >>> type(var2)
        <type 'list'>
        

        【讨论】:

          猜你喜欢
          • 2019-02-27
          • 2021-04-25
          • 2015-04-06
          • 2013-10-31
          • 2016-02-24
          • 1970-01-01
          • 2022-01-20
          • 2023-03-07
          相关资源
          最近更新 更多