Bir listedeki her öğeyi bir int ile nasıl bölebilirsiniz?


154

Bir listedeki her elemanı bir int ile bölmek istiyorum.

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

Bu hata:

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

Neden bu hatayı aldığımı anlıyorum. Ama bir çözüm bulamadığım için sinirliyim.

Ayrıca denedi:

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

Hata:

ValueError: too many values to unpack

Beklenen Sonuç:

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


DÜZENLE:

Aşağıdaki kod bana beklenen sonucu verir:

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

Ancak bunu yapmanın daha kolay / hızlı bir yolu var mı?

Yanıtlar:


233

Deyimsel yol liste kavramasını kullanmak olacaktır:

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

veya orijinal listeye referans göndermeniz gerekiyorsa:

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

1
statik bir liste boyutu verildiğinde, bu yöntemlerden herhangi biri [mylist [0] / myint, mylist [1] /
myint

7
@ user1938107 neredeyse kesinlikle değil, ama yine de kaçınmalısınız mikro optimizasyon türüdür.
soulcheck

75

İlk önce denediğiniz yol numpy ile doğrudan mümkündür :

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

Bu tür işlemleri uzun listelerle ve özellikle herhangi bir bilimsel bilgi işlem projesinde yaparsanız, gerçekten numpy kullanmanızı tavsiye ederim.


4
Bu eski bir cevap olduğunu biliyorum ama hala okuyan herkes için: numpy.array kullanırken tür için örneğin tür belirtmeniz gerektiğini numpy.array([10,20,30,40,50,60,70,80,90], dtype='f')unutmayın. Aksi takdirde 3'e bölmek size 3.333 yerine sadece 3 verir ..
Richard Boonen

3
@RichardBoonen bu durumda OP int bölümü yapmak istedi, ancak float bölümü yapmak istiyorsanız, haklısınız, numpy türünü belirtmelisiniz. Veya listeye tek bir şamandıra yerleştirin: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]

Bu durumda haritanın liste kavrayışından daha iyi olduğunu düşünüyor musunuz? Okuması daha kolay olduğu için sadece liste kavrayışına gittiğim gibi merak ediyorum.
Andrew Cox

@AndrewCox Haritayı tercih ediyorum (python olmayan bir arka plandan geliyor). Liste anlama da benim için daha temiz görünüyor, bu yüzden muhtemelen buna devam etmelisin.
Dogbert

Bunun çözüm soulcheck ve berkantk'tan daha hızlı olup olmadığını biliyor musunuz?
Casa

@Casa: Birisi bunu stackoverflow.com/q/1247490 adresinde test etti . Sonuç, bu özel durumda liste kavrayışlarının kazanıldığı görülmektedir.
Brian

4
Günümüzde map()bir harita nesnesi döndürdüğünden, bir liste istiyorsanız açıkça söylemelisiniz list(). Bu durumda: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

Soyut sürüm olabilir:

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)]

Daha kısa yazabilir misiniz?
E.Coms
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.