Як поділити кожен елемент у списку на 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)

Але чи є простіший / швидший спосіб зробити це?

Відповіді:


233

Ідіоматичним способом було б використання розуміння списку:

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]

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.


4
Я знаю, що це стара відповідь, але для тих, хто все ще її читає: майте на увазі, що при використанні numpy.array слід вказати тип, наприклад, numpy.array([10,20,30,40,50,60,70,80,90], dtype='f')для loat. В іншому випадку ділення на 3 дасть вам лише 3, а результат - 3.333 ..
Річард Буун

3
@RichardBoonen в цьому випадку ОП хотів зробити Int поділ, але якщо ви хочете зробити плаваючий поділ, ви маєте рацію, вам потрібно вказати тип для нумерування. Або покладіть один 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]

Як ви вважаєте, карта в цьому випадку краща за розуміння списку? Мені просто цікаво, як би я пішов на ознайомлення зі списком, оскільки його легше читати.
Ендрю Кокс

@AndrewCox Я віддаю перевагу карті (з фоном, який не є пітоном). Зрозуміння списків мені здається чистішим, тому ви, мабуть, повинні піти з цим.
Догберт

Чи знаєте ви, чи швидше це, ніж опубліковані душек-рішення та беркантк?
Каса

@Casa: хтось перевірив це на сайті stackoverflow.com/q/1247490 . Здається, що в цьому конкретному випадку розуміння списку виграє.
Брайан

4
Сьогодні map()повертає об’єкт на карті, тож якщо ви хочете список, ви повинні прямо сказати list(). Тож у цьому випадку:newList = list(map(lambda x: x/myInt, myList))
robertmartin8


6

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

import numpy as np
myList = [10, 20, 30, 40, 50, 60, 70, 80, 90]
myInt = 10
newList  = np.divide(myList, myInt)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.