2016-12-30 1 views
-3

私は、最初のクラスを持っている:クラスオブジェクトのリストのリストを反復すると、そのオブジェクトは反復可能ではないことを返しますか?

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

そして、fooのクラスを使用して別のクラス:foosfooのリストである

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

。私は今、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'はイテレータではありません。 –

+0

さて、バーをイテレータにする方法はありますか? –

答えて

0

問題は、あなたがbar個人代わりfoo Sのリストの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のリスト内でマップを実行して終了する

+0

テストのおかげで、彼らは問題を見つけるのを助けました! –

関連する問題