リストの各要素をintでどのように分割しますか?


154

リストの各要素をintで除算したいだけです。

myList = [10,20,30,40,50,60,70,80,90]
myInt = 10
newList = myList/myInt

これはエラーです:

TypeError: unsupported operand type(s) for /: 'list' and 'int'

このエラーが発生する理由を理解しています。しかし、解決策が見つからないことに私は不満を感じています。

また試しました:

newList = [ a/b for a, b in (myList,myInt)]

エラー:

ValueError: too many values to unpack

期待される結果:

newList = [1,2,3,4,5,6,7,8,9]


編集:

次のコードは私の期待する結果を私に与えます:

newList = []
for x in myList:
    newList.append(x/myInt)

しかし、これを行うためのより簡単な/より速い方法はありますか?

回答:


233

慣用的な方法は、リスト内包表記を使用することです。

myList = [10,20,30,40,50,60,70,80,90]
myInt = 10
newList = [x / myInt for x in myList]

または、元のリストへの参照を維持する必要がある場合:

myList[:] = [x / myInt for x in myList]

1
静的なリストサイズが与えられた場合、これらの方法のいずれかが[mylist [0] / myint、mylist [1] / myint]よりも高速になり
ます

7
@ user1938107はほぼ間違いなくそうですが、これはとにかく避けるべきミクロの最適化の一種でもあります。
soulcheck 2015年

75

あなたが最初に試した方法は実際にはnumpyで直接可能です:

import numpy
myArray = numpy.array([10,20,30,40,50,60,70,80,90])
myInt = 10
newArray = myArray/myInt

長いリストを使用してこのような操作を行う場合、特にあらゆる種類の科学計算プロジェクトで、numpyを使用することをお勧めします。


4
私はこれが古い返答であることを知っていますが、まだそれを読んでいる人のために:numpy.arrayを使用するときは、たとえばloatのタイプを指定する必要があることに注意してくださいnumpy.array([10,20,30,40,50,60,70,80,90], dtype='f')。それ以外の場合は3で割ること..あなたにちょうど3の代わりに3.333の結果を与えるだろう
リチャード・ボーネン

3
この場合、@ RichardBoonenはOPがint除算を実行したかったのですが、float除算を実行したい場合は、そのとおりです。型をnumpyに指定する必要があります。またはリスト内の単一のフロートを置く:numpy.array([10.,20,30,40,50,60,70,80,90])
silvado

24
>>> myList = [10,20,30,40,50,60,70,80,90]
>>> myInt = 10
>>> newList = map(lambda x: x/myInt, myList)
>>> newList
[1, 2, 3, 4, 5, 6, 7, 8, 9]

この場合、マップはリスト内包よりも優れていると思いますか?読みやすいので、リストを理解するのと同じように考えているだけです。
Andrew Cox

@AndrewCox私はマップを好みます(Python以外の背景からのもの)。リストの内包表記も私にはすっきりしているように見えるので、おそらくそれを使用する必要があります。
Dogbert

これがsoulcheckとberkantkが投稿したソリューションよりも速いかどうか知っていますか?
カーサ

@Casa:誰かがstackoverflow.com/q/1247490でこれをテストしました。結論としては、この特定のケースでは、リスト内包表記が勝つようです。
ブライアン

4
最近map()はマップオブジェクトを返すので、リストが必要な場合は明示的に言う必要がありますlist()。したがって、この場合:newList = list(map(lambda x: x/myInt, myList))
robertmartin8

9
myList = [10,20,30,40,50,60,70,80,90]
myInt = 10
newList = [i/myInt for i in myList]

6

抽象バージョンは次のとおりです。

import numpy as np
myList = [10, 20, 30, 40, 50, 60, 70, 80, 90]
myInt = 10
newList  = np.divide(myList, myInt)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.