Làm thế nào để bạn chia mỗi phần tử trong một danh sách cho một int?


154

Tôi chỉ muốn chia mỗi phần tử trong một danh sách cho một int.

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

Đây là lỗi:

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

Tôi hiểu tại sao tôi nhận được lỗi này. Nhưng tôi thất vọng vì tôi không thể tìm ra giải pháp.

Cũng đã thử:

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

Lỗi:

ValueError: too many values to unpack

Kết quả dự kiến:

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


BIÊN TẬP:

Đoạn mã sau cho tôi kết quả mong đợi:

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

Nhưng có một cách dễ dàng hơn / nhanh hơn để làm điều này?

Câu trả lời:


233

Cách thành ngữ sẽ là sử dụng hiểu danh sách:

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

hoặc, nếu bạn cần duy trì tham chiếu đến danh sách ban đầu:

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

1
với một kích thước danh sách tĩnh, một trong hai phương thức này sẽ nhanh hơn [mylist [0] / myint, mylist [1] / myint]
user-2147482637

7
@ user1938107 gần như chắc chắn là không, nhưng đây cũng là loại tối ưu hóa vi mô bạn nên tránh.
soulcheck 2/03/2015

75

Cách bạn đã thử đầu tiên thực sự có thể trực tiếp với numpy :

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

Nếu bạn thực hiện các hoạt động như vậy với các danh sách dài và đặc biệt là trong bất kỳ loại dự án máy tính khoa học nào, tôi thực sự sẽ khuyên bạn nên sử dụng numpy.


4
Tôi biết đây là một câu trả lời cũ nhưng đối với bất kỳ ai vẫn đọc nó: hãy nhớ rằng khi sử dụng numpy.array bạn nên chỉ định loại ví dụ numpy.array([10,20,30,40,50,60,70,80,90], dtype='f')cho loat. Nếu không, chia cho 3 sẽ cho bạn chỉ 3 kết quả thay vì 3.333 ..
Richard Boonen

3
@RichardBoonen trong trường hợp này OP muốn thực hiện phép chia int, nhưng nếu bạn muốn thực hiện phép chia float, bạn đã đúng, bạn phải chỉ định loại để numpy. Hoặc đặt một số float duy nhất trong danh sách: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]

Bạn có nghĩ rằng bản đồ là tốt hơn so với danh sách hiểu trong trường hợp này? Tôi chỉ tự hỏi là tôi sẽ đi để hiểu danh sách, vì nó dễ đọc hơn.
Andrew Cox

@AndrewCox Tôi thích bản đồ (đến từ nền không phải trăn). Danh sách hiểu có vẻ cũng sạch hơn đối với tôi, vì vậy bạn có lẽ nên đi với điều đó.
Dogbert

Bạn có biết nếu điều này là nhanh hơn so với giải pháp soulcheck và berkantk được đăng?
Casa

@Casa: Ai đó đã thử nghiệm điều này tại stackoverflow.com/q/1247490 . Kết luận dường như là danh sách hiểu được chiến thắng, trong trường hợp cụ thể này.
Brian

4
Ngày nay map()trả về một đối tượng bản đồ, vì vậy nếu bạn muốn có một danh sách, bạn phải nói rõ ràng list(). Vì vậy, trong trường hợp này: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

Phiên bản trừu tượng có thể là:

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

Bạn có thể viết ngắn hơn?
E.Coms
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.