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.