リストの各要素に数値を掛けるにはどうすればよいですか?


94

私はリストを持っています:

my_list = [1, 2, 3, 4, 5]

各要素にmy_list5を掛けるにはどうすればよいですか?出力は次のようになります。

[5, 10, 15, 20, 25]

2
使用するmap方が良いですfor-loop
トニー

9
そして、リスト内包表記は(ほとんどの場合)よりも優れていますmap(そして、mapが必要な場合は常に優れていますlambda)。
ShadowRanger 2016

回答:


138

リスト内包表記を使用できます。

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]

大文字で始まる変数名はPythonicではありません。そして、それらはリストであり、数字ではありません。だから私は使用をお勧めしたいl1l2変数名など。
カシミールクリスタル

4
文字「l」と数字1は簡単に混同されるため、変数として「l」を使用することもお勧めしません。私はOPの元の質問の変数を使用しましたが、質問の編集は良いことよりも害を及ぼしたと思います。
アレクサンダー

1
私の編集が悪いと感じた場合は、質問を編集して改善することができます。また、我々は、のではなく、他の変数を選択することができるl1などl_1list_1これらは全てよりも優れているなど、Num_1
カシミールクリスタル

26

非常に高速なアプローチは、リストをループするのではなく、ベクトル化された方法で乗算を行うことです。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_listto5__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)

なぜnumpyメソッドが「非常に高速」なのか興味がありますか?いくつかのリソースについて詳しく説明したり、指摘したりできますか?ベクトル化とは何かわかりません。
AerinmundFagelson20年

1
ここ@AerinmundFagelson - > stackoverflow.com/questions/35091979/...
Kasravnd

@Kasramvdそのリンクは正しくありません。このリンクでは、単一命令-複数データとしてのベクトル化の異なる意味について説明しています(GPUのように、一度に多くのデータに操作を適用します)。NumPyのコンテキストでは、ベクトル化とは、純粋なPythonではなく、高速でプリコンパイルされたCループを使用してデータシーケンスを操作することを指します。
xjcl


19

次のようにインプレースで実行できます。

 l = [1, 2, 3, 4, 5]
 l[:] = [x * 5 for x in l]

これは追加のインポートを必要とせず、非常にpythonicです。


さらに、この概念についてさらに情報を調べたい場合は、リスト内包表記と呼ばれます。
マイケル

1
私はむしろいただきたいl = [x * 5 for x in l]超えますl[:] = [x * 5 for x in l]。後者は新しいリストを作成し、それを使用して、lより安価な参照を再割り当てするのではなく、の内容を上書きします。実際にスペースが心配な場合は、ループを繰り返して、その場で変更してください。
cs 9520

6

あなたは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

「長い道のり」はどのように優れていますか?長くなり、したがって読みにくくなり、書きやすくなりません。
lirtosiast 2016

1
たぶん、あなたは私のタイトルに間違った印象を持っていて、私はそれがこれ以上良いとは決して言いませんでした。理解を使わずにそれを行う方法を彼に見せようとしただけです。なぜなら、Pythonを初めて使用したときの経験では、理解の概念を簡単に理解できなかったからです。
ellaRT 2016

ああ、大丈夫。関数型言語から始めたので、直接関係することはできません。
lirtosiast 2016

なるほど。答えを編集して、効率的な方法も含めました。
ellaRT 2016

4

マップあり(それほど良くはありませんが、問題への別のアプローチ):

list(map(lambda x: x*5,[5, 10, 15, 20, 25]))

また、numpyまたはnumpy配列を使用している場合は、次のように使用できます。

import numpy as np
list(np.array(x) * 5)

timesfive関数を定義する代わりにラムダを使用してみませんか?
Vimanyu

3
from functools import partial as p
from operator import mul
map(p(mul,5),my_list)

あなたがそれを行うことができる1つの方法です...あなたの先生はおそらくクラスでカバーされたはるかに簡単方法を知っているでしょう


ラムダ式を使用すると、インポートステートメントなしでそれを行うことができます。また、スニペットはマップオブジェクトを返しますが、これはリストにキャストしない限り役に立ちません。list(map(lambda x:5 * x、my_list))。
Castle-bravo 2016

@ castle-bravoその有用性は、それを使って何をする必要があるかによって異なります...このソリューションを実現する方法はたくさんあります(私が述べたように...)
Joran Beasley 2016

4
map一緒に使うことを人々に教えないでくださいlambda; が必要になった瞬間にlambda、リスト内包表記またはジェネレータ式を使用したほうがよいでしょう。あなたのしている巧妙な場合は、可能にするmapことなく、仕事をlambda、この場合には例えば、SAロットmap((5).__mul__, my_list)、この特定のケースでは、簡単なためバイトコードインタプリタでいくつかの最適化のおかげものの、int数学は、[x * 5 for x in my_list]よりPython的かつ簡単であるだけでなく、高速であります。
ShadowRanger 2016

1

各要素を乗算するmy_listことによりk

k = 5
my_list = [1,2,3,4]
result = list(map(lambda x: x * k, my_list))

その結果: [5, 10, 15, 20]


0

リスト内包表記またはマップを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

-1

最良の方法は、リスト内包表記を使用することです。

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]


これは、受け入れられた答えを受け取り、それを関数に変換するだけです。SOの応答の半分以上でそれを行うことができるかもしれませんが、それは何も追加せず、OPが要求したものではありません。
アレクサンダー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.