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?

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]

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.


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]

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]

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)

0
myInt=10
myList=[tmpList/myInt for tmpList in range(10,100,10)]

Bisakah Anda menulis lebih pendek?
— E.Coms
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.