2016-03-29 9 views
4

にリストのリストのすべての要素に「ワンライナー」の割り当てを実行するためにどのように、私は私がリスト<code>lol</code>のリストを考えるのpython

を試してみました

for ele in lol: 
    ele[1] = -2 

1行でやりたいです

lol = map(lambda x: x[1] = -2, lol) 

しかし、ラムダ関数で代入を実行することはできません。

+0

改行を取り除いてみましたか?: 'for ele:lol:ele [1] = -2' – cdarke

+2

なぜあなたはこれをやりたいのですか? –

+1

@cdarke:PEP 8に対しては1行の複合語が使われています。 – zondo

答えて

7

私は自分自身のアプローチを変更しないだろうが、あなたの質問に答えるために:

lol = [[1,3],[3,4]] 
from operator import setitem 

map(lambda x: setitem(x, 1, -2), lol) 
print(lol) 
[[1, -2], [3, -2]] 

それは場所に割り当てを行いますが、あなたは基本的に副作用のためにマップを使用してなしのリストを作成している:

In [1]: lol = [[1, 3], [3, 4]] 


In [2]: from operator import setitem 

In [3]: map(lambda x: setitem(x, 1, -2), lol) 
Out[3]: [None, None] 

In [4]: lol 
Out[4]: [[1, -2], [3, -2]] 

本当に自分のループロジックに固執してください。

彼ら単純なループもよりパフォーマンスです:

In [13]: %%timeit           
lol = [[1,2,3,4,5,6,7,8] for _ in range(100000)] 
map(lambda x: setitem(x, 1, -2), lol) 
    ....: 

10 loops, best of 3: 45.4 ms per loop 

In [14]: 

In [14]: %%timeit           
lol = [[1,2,3,4,5,6,7,8] for _ in range(100000)] 
for sub in lol: 
    sub[1] = -2 
    ....: 
10 loops, best of 3: 31.7 ms per 

のみタイムマップ。フィルタなどは本当にうまくいきます。組み込みの関数やメソッドで呼び出すことができれば、つまりmap(str.strip, iterable)を入力すると、ラムダを組み込むと通常は大ヒットとなります。

+0

これはforループより速いでしょうか? – rwolst

+1

@rwolst、マップ、フィルタなどが見つかりました。ラムダなしで呼び出すことができるときは、本当に効率的です。ラムダが関与すると、大きなパフォーマンスが得られます。 –

1

あなたが試してみました:

>>> lol = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 
>>> lol =[[-2] + mas for x, *mas in lol] 
>>> lol 
[[-2, 2, 3], [-2, 5, 6], [-2, 8, 9]] 
>>> 
7

をあなたはoperatorsetitem()機能を使用することができます。

from operator import setitem 

lol = [setitem(x, 1, -2) or x for x in lol] 

をあなたはまたlol再定義を取り出し、ちょうどこの操作を行うことができます。

from operator import setitem 

map(lambda x: setitem(x, 1, -2), lol) 

または

from operator import setitem 

[setitem(x, 1, -2) for x in lol] 

私はPadraicに同意する必要がありますが、あなたのアプローチはうまく見えます。

1

この答えは、最も効率的な方法ではありません、私はちょうどそれが品質だと、それはそうするPython的な方法だ場合、それがdownvotedだ場合はそうでない私は、それを削除しますについてのフィードバックを得るためにそれを掲示しています:

>>> lol 
[[1, 3], [3, 4]] 
>>> 
>>> 
>>> list(map(lambda x:x.__setitem__(1, -2), lol)) #list required in Python 3 
[None, None] 
>>> lol 
[[1, -2], [3, -2]] 
+1

そうではありません。実際に生成するリスト/イテレータが必要ない場合は、 'map'を使わないでください。代わりに 'for'ループを使用してください。 – chepner

+2

確かにピジョンソニックではありませんが、どちらも他の解決策ではありません。私は本質的にそれが良いアイデアなのかどうかという疑問でした。+1、猫を肌にさらす別の方法 –

+0

フィードバックのおかげで、私は生成されたリスト/イテレータを@chepnerが指摘しているように嫌いですが、同じメソッドを使って回避することはできますか?それとも、forループを使用する必要がありますか? –

関連する問題