Как вы делите каждый элемент в списке на 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)

Но есть ли более простой / быстрый способ сделать это?

Casa
источник

Ответы:

234

Идиоматический способ - использовать понимание списка:

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]
soulcheck
источник
1
учитывая размер статического списка, любой из этих методов будет быстрее, чем [mylist [0] / myint, mylist [1] / myint]
user-2147482637
7
@ user1938107 почти наверняка нет, но это также тот вид микрооптимизации, которого вам все равно следует избегать.
проверка души
75

То, как вы попробовали сначала, на самом деле возможно с помощью numpy :

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

Если вы выполняете такие операции с длинными списками и особенно в каких-либо научных вычислительных проектах, я бы действительно советовал использовать numpy.

silvado
источник
4
Я знаю, что это старый ответ, но для тех, кто все еще его читает: имейте в виду, что при использовании numpy.array вы должны указать тип, например, numpy.array([10,20,30,40,50,60,70,80,90], dtype='f')для loat. В противном случае деление на 3 даст вам всего 3 результата вместо 3.333 ..
Ричард
3
@RichardBoonen в этом случае OP хотел сделать int-деление, но если вы хотите сделать float-деление, вы правы, вы должны указать тип numpy. Или поместите один поплавок в список:numpy.array([10.,20,30,40,50,60,70,80,90])
Сильвадо
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
источник
Как вы думаете, карта лучше, чем список понимания в этом случае? Мне просто интересно, как я пошел бы для понимания списка, так как это легче читать.
Эндрю Кокс
@AndrewCox Я предпочитаю карту (из не питона). Понимание списков мне тоже кажется чище, так что, наверное, вам стоит пойти с этим.
Догберт
Знаете ли вы, если это быстрее, чем опубликованные решения Soulcheck и Berkantk?
Casa
@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]
NotCamelCase
источник
6

Абстрактная версия может быть:

import numpy as np
myList = [10, 20, 30, 40, 50, 60, 70, 80, 90]
myInt = 10
newList  = np.divide(myList, myInt)
Armin
источник
0
myInt=10
myList=[tmpList/myInt for tmpList in range(10,100,10)]
Ричард
источник
Не могли бы вы написать короче?
E.Coms