2016-02-03 18 views
17

Tôi có một danh sách:Làm cách nào để nhân mỗi phần tử trong một danh sách theo một số?

my_list = [1, 2, 3, 4, 5] 

Làm thế nào tôi có thể nhân mỗi phần tử trong my_list 5? Sản lượng nên là:

[5, 10, 15, 20, 25] 
+2

Sử dụng 'map' tốt hơn' for-loop'. – Tony

+6

[Và danh sách hiểu là (hầu như luôn luôn) tốt hơn so với 'bản đồ'] (https://stackoverflow.com/questions/1247486/python-list-comprehension-vs-map) (và luôn luôn tốt hơn nếu' map' sẽ yêu cầu một 'lambda'). – ShadowRanger

Trả lời

33

Bạn chỉ có thể sử dụng danh sách hiểu:

my_list = [1, 2, 3, 4, 5] 
my_new_list = [i * 5 for i in my_list] 

>>> print(my_new_list) 
[5, 10, 15, 20, 25] 

Lưu ý rằng danh sách hiểu biết nói chung là một cách hiệu quả hơn để làm một vòng lặp for:

my_new_list = [] 
for i in my_list: 
    my_new_list.append(i * 5) 

>>> print(my_new_list) 
[5, 10, 15, 20, 25] 

Là một thay thế, đây là một giải pháp sử dụng gói Pandas phổ biến:

import pandas as pd 

s = pd.Series(my_list) 

>>> s * 5 
0  5 
1 10 
2 15 
3 20 
4 25 
dtype: int64 

Hoặc, nếu bạn jus t muốn danh sách:

>>> (s * 5).tolist() 
[5, 10, 15, 20, 25] 
+0

Tên biến bắt đầu bằng mũ không phải là Pythonic. Và chúng là danh sách chứ không phải số. Vì vậy, tôi đề nghị sử dụng 'l1' và' l2' làm tên biến. –

+2

Việc sử dụng 'l' làm biến cũng không được khuyến khích vì chữ 'l' và số 1 dễ nhầm lẫn. Tôi đã sử dụng các biến trong câu hỏi ban đầu của OP và tôi tin rằng bản chỉnh sửa câu hỏi của bạn đã gây hại nhiều hơn lợi ích. – Alexander

+1

Nếu bạn cảm thấy chỉnh sửa của tôi xấu, bạn có thể chỉnh sửa câu hỏi để cải thiện nó. Ngoài ra, chúng ta có thể chọn biến khác thay vì 'l1' như' l_1', 'list_1', v.v. Tất cả đều tốt hơn' Num_1'. –

3
from functools import partial as p 
from operator import mul 
map(p(mul,5),my_list) 

là một cách để bạn có thể làm điều đó ... giáo viên của bạn có thể biết một ít nhiều phức tạp như vậy có lẽ đã được bao phủ trong lớp

+0

Bạn có thể làm điều đó mà không có các câu lệnh nhập khẩu bằng cách sử dụng một biểu thức lambda. Ngoài ra, đoạn mã của bạn trả về một đối tượng bản đồ, điều này là vô ích trừ khi được truyền tới một danh sách. danh sách (bản đồ (lambda x: 5 * x, my_list)). –

+0

@ castle-bravo tính hữu ích của nó phụ thuộc vào những gì bạn cần làm với nó ...có rất nhiều cách để hoàn thành giải pháp này (như tôi đề cập đến ...) –

+1

Xin đừng dạy mọi người sử dụng 'bản đồ' với 'lambda'; ngay lập tức bạn cần một 'lambda', bạn đã tốt hơn với một biểu thức hiểu danh sách hoặc biểu thức máy phát. Nếu bạn thông minh, bạn _can_ làm cho 'map' hoạt động mà không có' lambda 'rất nhiều, ví dụ: trong trường hợp này, 'map ((5) .__ mul__, my_list)', mặc dù trong trường hợp cụ thể này, nhờ vào một số tối ưu trong trình thông dịch mã byte cho phép toán 'int' đơn giản,' [x * 5 cho x trong my_list] ' là nhanh hơn, cũng như được nhiều hơn Pythonic và đơn giản hơn. – ShadowRanger

6

Vì tôi nghĩ rằng bạn là mới với Python, cho phép làm theo cách dài, lặp qua danh sách của bạn bằng cách sử dụng cho vòng lặp và nhân và nối thêm mỗi phần tử vào một danh sách mới.

sử dụng vòng lặp for

lst = [5, 20 ,15] 
product = [] 
for i in lst: 
    product.append(i*5) 
print product 

sử dụng danh sách hiểu biết, đây cũng là tương tự như sử dụng cho vòng lặp nhưng nhiều hơn 'pythonic'

lst = [5, 20 ,15] 

prod = [i * 5 for i in lst] 
print prod 
+0

Cách "đường dài" theo bất kỳ cách nào tốt hơn? Nó dài hơn - do đó khó đọc hơn — và không dễ viết hơn. – lirtosiast

+1

okay có thể bạn đã có ấn tượng sai về tiêu đề của tôi và tôi không bao giờ nói rằng nó là tốt hơn, chỉ cần cố gắng để cho anh ta làm thế nào để làm điều đó mà không cần sử dụng hiểu. bởi vì trên kinh nghiệm của tôi khi tôi còn mới trong python tôi đã không thể nắm bắt được khái niệm dễ hiểu. – essramos

+0

Ồ, được rồi. Tôi không thể liên hệ trực tiếp vì tôi bắt đầu với các ngôn ngữ chức năng. – lirtosiast

9

Bạn có thể làm điều đó tại chỗ như vậy:

l = [1, 2, 3, 4, 5] 
l[:] = [x * 5 for x in l] 

Điều này không yêu cầu nhập khẩu bổ sung và rất đa dạng.

+0

Ngoài ra: khái niệm này được gọi là _list comprehension_ nếu bạn muốn tìm kiếm thêm thông tin về nó. – Michael

4

Một NumPy cách tiếp cận đối với danh sách dài hơn:

>>> import numpy as np 
>>> 
>>> my_list = np.array([1, 2, 3, 4, 5]) 
>>> 
>>> my_list * 5 
array([ 5, 10, 15, 20, 25]) 
0

Với bản đồ (không phải là tốt, nhưng cách tiếp cận khác cho vấn đề):

def timesfive(number): return number*5 
list(map(timesfive,[5, 10, 15, 20, 25])) 
0

nhất cách sử dụng danh sách hiểu:

def map_to_list(my_list, n): 
# multiply every value in my_list by n 
# Use list comprehension! 
    my_new_list = [i * n for i in my_list] 
    return my_new_list 
# To test: 
print(map_to_list([1,2,3], -1)) 

Lợi nhuận: [-1, -2, -3]

Các vấn đề liên quan