2016-12-30 107 views
-3

我有一个初始等级:遍历类对象列表的列表,返回该对象不可迭代?

class foo: 
    def __init__(self, a, b): 
     self.a = a 
     self.b = b 

和使用Foo类另一个类:

class bar: 
    def __init__(self, foos): 
     self.foos = sorted(foos, key=attrgetter('a')) 

其中foosfoo列表。我现在想采取的foo名单列表,这东西看起来像:

lofoos = [[foo1, foo2, foo3], [foo4, foo5, foo6] ...] 

,我想使用地图功能来做到这一点:

list(map(lambda foos: bar(foos), lofoos)) 

但这返回错误:

TypeError: iter() returned non-iterator of type 'foo'. 

有没有简单的解决方案呢?

+0

的目录列表做一个地图,请给出[MCVE]与完整的回溯。 – jonrsharpe

+0

这很简单:'foo'不是迭代器。 – 2016-12-30 19:59:45

+0

好的,有没有办法让bar成为迭代器? –

回答

0

的问题是,你给bar个人foo代替foo秒的列表,以及放置打印揭示问题

from operator import attrgetter 

class foo: 
    def __init__(self, a, b): 
     self.a = a 
     self.b = b 
    def __repr__(self): 
     return "{0.__class__.__name__}({0.a},{0.b})".format(self) 

class bar: 
    def __init__(self, foos): 
     print("foos=",foos) 
     self.foos = sorted(foos, key=attrgetter('a')) 
    def __repr__(self): 
     return "{0.__class__.__name__}({0.foos})".format(self) 

lofoos = [[foo(1,0), foo(2,0), foo(3,0)], [foo(4,1), foo(5,1), foo(6,1)]] 
print("test list of lists of foo") 
print(list(map(lambda foos: bar(foos), lofoos))) 
print("\n") 
print("test list of foo") 
print(list(map(lambda foos: bar(foos), lofoos[0]))) 

输出

test list of lists of foo 
foos= [foo(1,0), foo(2,0), foo(3,0)] 
foos= [foo(4,1), foo(5,1), foo(6,1)] 
[bar([foo(1,0), foo(2,0), foo(3,0)]), bar([foo(4,1), foo(5,1), foo(6,1)])] 


test list of foo 
foos= foo(1,0) 
Traceback (most recent call last): 
    File "C:\Users\David\Documents\Python Scripts\stackoverflow_test.py", line 24, in <module> 
    print(list(map(lambda foos: bar(foos), lofoos[0]))) 
    File "C:\Users\David\Documents\Python Scripts\stackoverflow_test.py", line 24, in <lambda> 
    print(list(map(lambda foos: bar(foos), lofoos[0]))) 
    File "C:\Users\David\Documents\Python Scripts\stackoverflow_test.py", line 15, in __init__ 
    self.foos = sorted(foos, key=attrgetter('a')) 
TypeError: 'foo' object is not iterable 
>>> 

记得什么map(fun,[a,b,c])呢是生产[fun(a),fun(b),fun(c)]

因此,在代码中的某个地方,你结束的foo一个列表,而不是的foo

+0

谢谢你的测试中,他们帮助了很多在发现问题! –