2016-07-18 44 views
0

ここでは私のコードです:反復処理

map(lambda i: 3*i, map(lambda x: x, [[1, 2],[3, 4]])) 

それは出力:[[1, 2, 1, 2, 1, 2], [3, 4, 3, 4, 3, 4]]

どのように私は3, 6, 9, 12を印刷し、それを修正するのですか?

私はappendを使いたくありません。ちょうど地図とラムダ。

答えて

2

この問題は、内部のmapが一連の番号ではなく一連のリストを返すという事実から発生します。これは、mapが小さいリストを含むリストを反復しているからです。したがって、itertools.chain.from_iterableを使用してそのリストをフラット化すると、一連の数字が得られます。その後、予想通りPythonで*オペレータが多型であるため、あなたのコードは動作しませんでした

In [67]: L = [[1, 2],[3, 4]] 

In [68]: for i in map(lambda i: 3*i, itertools.chain.from_iterable(L)): print(i) 
3 
6 
9 
12 
1

それらを三つ組する外側mapを使用することができます。つまり、xnが数字の場合、x*nは両方の数値の積を返しますが、一方のオペランド(たとえばn)が整数でもう一方がシーケンス(.e。xはリスト、タプルまたは文字列)式x*nは、xを連結した結果のシーケンスをn回返します。例:

>>> your_list = [[1, 2], [3, 4]] 
>>> flat_list = [item for sublist in your_list for item in sublist] 
>>> flat_list 
[1, 2, 3, 4] 
>>> triples = map(lambda x: 3*x, flat_list) 
>>> triples 
[3, 6, 9, 12] 

実際にあなたがmap()lambdaを使用する必要はありません:あなたはmap()を適用する前に、あなたのリストを平らにする必要が期待される結果を得るために

>>> .1 * 2.5 
0.25 
>>> [1, 2] * 3 
[1, 2, 1, 2, 1, 2] 
>>> "beep" * 2 
beepbeep 

。私は1ライナーのリストの理解を使用すると、もっとpythonicだろうと思う:

>>> triples = [3*item for sublist in your_list for item in sublist] 
>>> triples 
[3, 6, 9, 12]