2014-01-19 20 views
0

努力学习蟒蛇,我试图做的事:Python的 - 步通过列表-TypeError: '诠释' 对象不是可迭代

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 

这是可能的蟒蛇?我知道我已经做了这个或其他语言类似的东西。

+0

请注意,在这里的行末尾不需要';'。这不是PHP或任何你可能来自的语言。 ;)为了完美,PEP8告诉你应该在'='周围放置空格(除非用作参数 - 稍后会看到)和其他运算符('+','-'等) 。 – JeromeJ

+0

在用作函数之前,我看不到在代码中声明的变量'list'。我认为你的意图是使用'list0 [z]'或'list1 [z]' – Tariq

回答

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

最相似觉得从你试图做什么使用的是创建一个由组成名单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类型。

0

list需要可迭代的参数。你把它称为整数

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

如果你使用这个特定的实现DEADSET(相信我,你真的应该做一个列表的列表作为其他答案建议),而不是做:

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) 
+0

这篇文章滥用KISS命令(保持简单愚蠢)。 **变量()**?!对初学者非常不好的建议 – volcano

0

首先,你并不需要,如果你要使用分号在Python每行只有1条语句。所以,你的代码示例:

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'> 
-1

问题出在:

list(z) 

使用列表的索引。 您必须更改为:

list[z] 
相关问题