Bagaimana Anda membagi setiap elemen dalam daftar dengan int?

154

Saya hanya ingin membagi setiap elemen dalam daftar dengan int.

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

Ini kesalahannya:

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

Saya mengerti mengapa saya menerima kesalahan ini. Tetapi saya frustrasi karena saya tidak dapat menemukan solusi.

Juga mencoba:

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

Kesalahan:

ValueError: too many values to unpack

Hasil yang diharapkan:

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


EDIT:

Kode berikut memberi saya hasil yang saya harapkan:

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

Tetapi apakah ada cara yang lebih mudah / lebih cepat untuk melakukan ini?

Casa
sumber

Jawaban:

233

Cara idiomatik adalah dengan menggunakan pemahaman daftar:

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

atau, jika Anda perlu mempertahankan referensi ke daftar asli:

myList[:] = [x / myInt for x in myList]
cek jiwa
sumber
1
diberi ukuran daftar statis, apakah salah satu dari metode ini akan lebih cepat daripada [mylist [0] / myint, mylist [1] / myint]
user-2147482637
7
@ user1938107 hampir pasti tidak, tetapi ini juga merupakan jenis optimasi mikro yang harus Anda hindari.
soulcheck
75

Cara Anda mencoba pertama sebenarnya mungkin secara langsung dengan numpy :

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

Jika Anda melakukan operasi seperti itu dengan daftar panjang dan terutama dalam segala jenis proyek komputasi ilmiah, saya akan sangat menyarankan menggunakan numpy.

silvado
sumber
4
Saya tahu ini adalah jawaban lama tetapi bagi siapa pun yang masih membacanya: perlu diingat bahwa ketika menggunakan numpy.array Anda harus menentukan jenis misalnya numpy.array([10,20,30,40,50,60,70,80,90], dtype='f')untuk loat. Kalau tidak, bagi dengan 3 akan memberi Anda hanya 3 sebagai hasilnya alih-alih 3,333 ..
Richard Boonen
3
@ RichardBoonen dalam hal ini OP ingin melakukan divisi int, tetapi jika Anda ingin melakukan divisi float, Anda benar, Anda harus menentukan jenisnya untuk numpy. Atau letakkan pelampung tunggal dalam daftar: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]
Dogbert
sumber
Apakah menurut Anda peta lebih baik daripada pemahaman daftar dalam hal ini? Saya hanya ingin tahu karena saya akan pergi untuk pemahaman daftar, karena lebih mudah dibaca.
Andrew Cox
@AndrewCox Saya lebih suka peta (berasal dari latar belakang non python). Pemahaman daftar tampaknya juga lebih bersih bagi saya, jadi Anda mungkin harus melakukannya.
Dogbert
Apakah Anda tahu kalau ini lebih cepat daripada solusi soulcheck dan berkantk diposting?
Casa
@Casa: Seseorang menguji ini di stackoverflow.com/q/1247490 . Kesimpulannya tampaknya bahwa pemahaman daftar menang, dalam kasus khusus ini.
Brian
4
Saat ini map()mengembalikan objek peta, jadi jika Anda ingin daftar Anda harus secara eksplisit mengatakan list(). Jadi dalam kasus ini: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]
NotCamelCase
sumber
6

Versi abstrak dapat berupa:

import numpy as np
myList = [10, 20, 30, 40, 50, 60, 70, 80, 90]
myInt = 10
newList  = np.divide(myList, myInt)
Armin
sumber
0
myInt=10
myList=[tmpList/myInt for tmpList in range(10,100,10)]
Richard
sumber
Bisakah Anda menulis lebih pendek?
E.Coms