にリストのリストのすべての要素に「ワンライナー」の割り当てを実行するためにどのように、私は私がリスト<code>lol</code>のリストを考えるのpython
を試してみましたfor ele in lol:
ele[1] = -2
1行でやりたいです
lol = map(lambda x: x[1] = -2, lol)
しかし、ラムダ関数で代入を実行することはできません。
にリストのリストのすべての要素に「ワンライナー」の割り当てを実行するためにどのように、私は私がリスト<code>lol</code>のリストを考えるのpython
を試してみましたfor ele in lol:
ele[1] = -2
1行でやりたいです
lol = map(lambda x: x[1] = -2, lol)
しかし、ラムダ関数で代入を実行することはできません。
私は自分自身のアプローチを変更しないだろうが、あなたの質問に答えるために:
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)
を入力すると、ラムダを組み込むと通常は大ヒットとなります。
これはforループより速いでしょうか? – rwolst
@rwolst、マップ、フィルタなどが見つかりました。ラムダなしで呼び出すことができるときは、本当に効率的です。ラムダが関与すると、大きなパフォーマンスが得られます。 –
あなたが試してみました:
>>> 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]]
>>>
をあなたはoperator
でsetitem()
機能を使用することができます。
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に同意する必要がありますが、あなたのアプローチはうまく見えます。
この答えは、最も効率的な方法ではありません、私はちょうどそれが品質だと、それはそうする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]]
そうではありません。実際に生成するリスト/イテレータが必要ない場合は、 'map'を使わないでください。代わりに 'for'ループを使用してください。 – chepner
確かにピジョンソニックではありませんが、どちらも他の解決策ではありません。私は本質的にそれが良いアイデアなのかどうかという疑問でした。+1、猫を肌にさらす別の方法 –
フィードバックのおかげで、私は生成されたリスト/イテレータを@chepnerが指摘しているように嫌いですが、同じメソッドを使って回避することはできますか?それとも、forループを使用する必要がありますか? –
改行を取り除いてみましたか?: 'for ele:lol:ele [1] = -2' – cdarke
なぜあなたはこれをやりたいのですか? –
@cdarke:PEP 8に対しては1行の複合語が使われています。 – zondo