私はリストを持っています:
my_list = [1, 2, 3, 4, 5]
各要素にmy_list
5を掛けるにはどうすればよいですか?出力は次のようになります。
[5, 10, 15, 20, 25]
私はリストを持っています:
my_list = [1, 2, 3, 4, 5]
各要素にmy_list
5を掛けるにはどうすればよいですか?出力は次のようになります。
[5, 10, 15, 20, 25]
回答:
リスト内包表記を使用できます。
my_list = [1, 2, 3, 4, 5]
my_new_list = [i * 5 for i in my_list]
>>> print(my_new_list)
[5, 10, 15, 20, 25]
リスト内包表記は、一般的にfor
ループを実行するためのより効率的な方法であることに注意してください。
my_new_list = []
for i in my_list:
my_new_list.append(i * 5)
>>> print(my_new_list)
[5, 10, 15, 20, 25]
別の方法として、人気のあるPandasパッケージを使用したソリューションを次に示します。
import pandas as pd
s = pd.Series(my_list)
>>> s * 5
0 5
1 10
2 15
3 20
4 25
dtype: int64
または、リストが必要な場合:
>>> (s * 5).tolist()
[5, 10, 15, 20, 25]
l1
とl2
変数名など。
l1
などl_1
、list_1
これらは全てよりも優れているなど、Num_1
。
非常に高速なアプローチは、リストをループするのではなく、ベクトル化された方法で乗算を行うことです。Numpyは、これを使用できる非常にシンプルで便利な方法をすでに提供しています。
>>> import numpy as np
>>>
>>> my_list = np.array([1, 2, 3, 4, 5])
>>>
>>> my_list * 5
array([ 5, 10, 15, 20, 25])
これはPythonのネイティブリストでは機能しないことに注意してください。数値にリストを掛けると、その数値のサイズとしての項目が繰り返されます。
In [15]: my_list *= 1000
In [16]: len(my_list)
Out[16]: 5000
リスト内包表記を使用した純粋なPythonベースのアプローチが必要な場合は、基本的に最もPython的な方法です。
In [6]: my_list = [1, 2, 3, 4, 5]
In [7]: [5 * i for i in my_list]
Out[7]: [5, 10, 15, 20, 25]
リスト内包表記のほかに、純粋関数アプローチmap()
として、次のように組み込み関数を使用することもできます。
In [10]: list(map((5).__mul__, my_list))
Out[10]: [5, 10, 15, 20, 25]
このコードは、my_list
to5
の__mul__
メソッド内のすべての項目を渡し、イテレータのようなオブジェクトを返します(python-3.xの場合)。次に、list()
組み込み関数を使用してイテレータをリストに変換できます(Python-2.xではmap
、デフォルトでリストが返されるため、これは必要ありません)。
In [18]: %timeit [5 * i for i in my_list]
463 ns ± 10.6 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In [19]: %timeit list(map((5).__mul__, my_list))
784 ns ± 10.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In [20]: %timeit [5 * i for i in my_list * 100000]
20.8 ms ± 115 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [21]: %timeit list(map((5).__mul__, my_list * 100000))
30.6 ms ± 169 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [24]: arr = np.array(my_list * 100000)
In [25]: %timeit arr * 5
899 µs ± 4.98 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
次のようにインプレースで実行できます。
l = [1, 2, 3, 4, 5]
l[:] = [x * 5 for x in l]
これは追加のインポートを必要とせず、非常にpythonicです。
l = [x * 5 for x in l]
超えますl[:] = [x * 5 for x in l]
。後者は新しいリストを作成し、それを使用して、l
より安価な参照を再割り当てするのではなく、の内容を上書きします。実際にスペースが心配な場合は、ループを繰り返して、その場で変更してください。
あなたはPythonを初めて使用すると思うので、長い道のりを実行し、forループを使用してリストを反復処理し、各要素を新しいリストに乗算して追加します。
forループの使用
lst = [5, 20 ,15]
product = []
for i in lst:
product.append(i*5)
print product
リスト内包表記を使用すると、これもforループを使用するのと同じですが、より多くの「pythonic」
lst = [5, 20 ,15]
prod = [i * 5 for i in lst]
print prod
マップあり(それほど良くはありませんが、問題への別のアプローチ):
list(map(lambda x: x*5,[5, 10, 15, 20, 25]))
また、numpyまたはnumpy配列を使用している場合は、次のように使用できます。
import numpy as np
list(np.array(x) * 5)
from functools import partial as p
from operator import mul
map(p(mul,5),my_list)
あなたがそれを行うことができる1つの方法です...あなたの先生はおそらくクラスでカバーされたはるかに簡単な方法を知っているでしょう
map
一緒に使うことを人々に教えないでくださいlambda
; が必要になった瞬間にlambda
、リスト内包表記またはジェネレータ式を使用したほうがよいでしょう。あなたのしている巧妙な場合は、可能にするmap
ことなく、仕事をlambda
、この場合には例えば、SAロットmap((5).__mul__, my_list)
、この特定のケースでは、簡単なためバイトコードインタプリタでいくつかの最適化のおかげものの、int
数学は、[x * 5 for x in my_list]
よりPython的かつ簡単であるだけでなく、高速であります。
リスト内包表記またはマップを1つのオブジェクト名xだけで使用するのは興味深いと思いました。xが再割り当てされるたびに、そのid(x)が変更される、つまり別のオブジェクトを指すことに注意してください。
x = [1, 2, 3]
id(x)
2707834975552
x = [1.5 * x for x in x]
id(x)
2707834976576
x
[1.5, 3.0, 4.5]
list(map(lambda x : 2 * x / 3, x))
[1.0, 2.0, 3.0]
id(x) # not reassigned
2707834976576
x = list(map(lambda x : 2 * x / 3, x))
x
[1.0, 2.0, 3.0]
id(x)
2707834980928
最良の方法は、リスト内包表記を使用することです。
def map_to_list(my_list, n):
# multiply every value in my_list by n
# Use list comprehension!
my_new_list = [i * n for i in my_list]
return my_new_list
# To test:
print(map_to_list([1,2,3], -1))
戻り値:[-1、-2、-3]
map
方が良いですfor-loop
。