Python - 逐步执行list -TypeError:'int'对象不可迭代

时间:2014-01-19 07:11:20

标签: python list for-loop int iterable

尝试学习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中可行吗?我知道我已经用其他语言完成了这个或类似的东西。

5 个答案:

答案 0 :(得分:3)

  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
    

答案 1 :(得分:1)

您尝试做的最相似的想法是创建一个由您拥有的2个列表组成的列表。因此,您可以通过0 or 1

形式的索引(lists[index])访问每个列表
lists = [['A', 'B'], ['C', 'D']]
z = 0
while z < 2:
    for q in lists[z]:
        print q
    z += 1

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

答案 2 :(得分:0)

list 需要一个iterable作为参数。你在整数

上调用它

答案 3 :(得分:0)

我认为没有人提到的一点是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)

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

list0 = ["A","B"]
...
list99 = ["Y","Z"]

lists = [list0, ... , list99]
for iterable in list:
    for element in iterable:
        print(element)

答案 4 :(得分:0)

首先,如果每行只有1个语句,则不需要在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'>

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

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