Як помножити кожен елемент у списку на число?


92

У мене є список:

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

Як я можу помножити кожен елемент my_listна 5? Результат повинен бути:

[5, 10, 15, 20, 25]

2
Використовувати mapкраще, ніж for-loop.
Тоні

9
І розуміння списку є (майже завжди) кращим, ніжmap (і завжди кращим, якщо mapце вимагає lambda).
ShadowRanger

Відповіді:


133

Ви можете просто використовувати розуміння списку:

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]

Зверніть увагу, що розуміння списку, як правило, є більш ефективним способом зробити forцикл:

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

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

Як альтернативу, ось рішення із використанням популярного пакету Pandas:

import pandas as pd

s = pd.Series(my_list)

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

Або, якщо вам просто потрібен список:

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

Ім'я змінних, яке починається з великих літер, не є пітонічним. І це списки, а не цифри. Тому я б запропонував використовувати l1і l2як ім'я змінної.
Казимир Кристал

4
Також не рекомендується використовувати "l" як змінну, оскільки букву "l" та цифру 1 легко сплутати. Я використав змінні в оригінальному запитанні OP, і я вважаю, що ваше редагування запитання принесло більше шкоди, ніж користі.
Олександр

1
Якщо ви вважаєте, що моє редагування погане, ви можете відредагувати питання, щоб покращити його. Крім того, ми можемо вибрати іншу змінну, а не l1таку як l_1, list_1і т. Д. Це все краще, ніж Num_1.
Казимир Кристал

26

Надзвичайно швидший підхід полягає у виконанні множення векторизованим способом, а не в циклічному перегляді списку. Numpy вже запропонував для цього дуже простий і зручний спосіб, яким ви можете скористатися.

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

Зверніть увагу, що це не працює з рідними списками Python. Якщо помножити число на список, він буде повторювати елементи, як розмір цього числа.

In [15]: my_list *= 1000

In [16]: len(my_list)
Out[16]: 5000

Якщо ви хочете отримати підхід на основі чистого Python, використання розуміння списку - це, в основному, найбільш пітонічний шлях.

In [6]: my_list = [1, 2, 3, 4, 5]

In [7]: [5 * i for i in my_list]
Out[7]: [5, 10, 15, 20, 25]

Окрім розуміння списку, як чисто функціональний підхід, ви також можете використовувати вбудовану map()функцію наступним чином:

In [10]: list(map((5).__mul__, my_list))
Out[10]: [5, 10, 15, 20, 25]

Цей код передає всі елементи в межах my_listдо 5«S __mul__методи і повертає ітератор типу об'єкта (в Пітоні-3.x). Потім ви можете перетворити ітератор у список за допомогою list()вбудованої функції (у Python-2.x це вам не потрібно, оскільки mapповертає список за замовчуванням).

орієнтири:

In [18]: %timeit [5 * i for i in my_list]
463 ns ± 10.6 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [19]: %timeit list(map((5).__mul__, my_list))
784 ns ± 10.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [20]: %timeit [5 * i for i in my_list * 100000]
20.8 ms ± 115 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [21]: %timeit list(map((5).__mul__, my_list * 100000))
30.6 ms ± 169 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)


In [24]: arr = np.array(my_list * 100000)

In [25]: %timeit arr * 5
899 µs ± 4.98 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

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

1
@AerinmundFagelson тут -> stackoverflow.com/questions/35091979 / ...
Kasravnd

@Kasramvd Це посилання неправильне. Посилання обговорює інший зміст векторизації як одна інструкція-множинні дані (застосовуючи операцію до багатьох даних одночасно, як це роблять графічні процесори). У контексті NumPy векторизація стосується використання швидких попередньо скомпільованих циклів C для роботи з послідовністю даних, а не чистого Python.
xjcl


19

Ви можете зробити це на місці так:

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

Це не вимагає додаткового імпорту і є дуже пітонічним.


Крім того: концепція називається розумінням списку, якщо ви хочете знайти більше інформації про неї.
Майкл

1
Я волів би l = [x * 5 for x in l]закінчити l[:] = [x * 5 for x in l]. Останній створює новий список, а потім використовує його для перезапису вмісту, на lвідміну від простого перепризначення посилання, яке дешевше. Якщо вас насправді турбує простір, просто повторіть цикл і мутуйте на місці.
cs95

6

Оскільки я думаю, що ви новачок у Python, давайте пройдемо довгий шлях, перебираємо ваш список за допомогою циклу for, множимо та додаємо кожен елемент до нового списку.

за допомогою циклу for

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

використовуючи розуміння списку, це теж саме, що використання for-loop, але більш `` пітонічне ''

lst = [5, 20 ,15]

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

Як "довгий шлях" у будь-якому випадку кращий? Це довше - отже, важче читати - і не легше писати.
lirtosiast

1
добре, можливо, у вас склалося неправильне враження про мою назву, і я ніколи не казав, що це краще, просто намагаючись показати йому, як це робити, не використовуючи розуміння. тому що на моєму досвіді, коли я був новим у python, я не зміг легко зрозуміти концепцію розуміння.
wasp8898

О, гаразд. Я не можу зв’язатись безпосередньо, оскільки я почав із функціональних мов.
lirtosiast

Бачу, ну там. Я відредагував відповідь, щоб також включити ефективний спосіб це зробити.
wasp8898

4

З картою (не так добре, але інший підхід до проблеми):

list(map(lambda x: x*5,[5, 10, 15, 20, 25]))

також, якщо ви випадково використовуєте масиви numpy або numpy, ви можете використовувати це:

import numpy as np
list(np.array(x) * 5)

Чому б не використовувати лямбду замість того, щоб визначати функцію timesfive?
Vimanyu

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

це один із способів зробити це ... ваш вчитель, мабуть, знає набагато менш складний спосіб, про який, мабуть, говорили в класі


Ви можете зробити це без операторів імпорту, використовуючи лямбда-вираз. Крім того, ваш фрагмент повертає об'єкт карти, який є марним, якщо не потрапляє до списку. список (карта (лямбда x: 5 * x, мій_ список)).
замок-браво

@ castle-bravo його корисність залежить від того, що з цим потрібно робити ... Є багато способів досягти цього рішення (як я вже згадував ...)
Джоран Бізлі,

4
Будь ласка , не вчимо людей використовувати mapз lambda; як тільки вам знадобиться lambda, вам було б краще з розумінням списку або виразом генератора. Якщо ви розумні, ви можете зробити mapроботу без lambdaбагато, наприклад, у цьому випадку, map((5).__mul__, my_list)хоча в цьому конкретному випадку, завдяки деяким оптимізаціям інтерпретатора байтового коду для простої intматематики, [x * 5 for x in my_list]це швидше, а також є більш пітонічним та простішим .
ShadowRanger

1

Помножуючи кожен елемент my_listна k:

k = 5
my_list = [1,2,3,4]
result = list(map(lambda x: x * k, my_list))

в результаті: [5, 10, 15, 20]


-1

Найкращий спосіб - використовувати розуміння списку:

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

Повертає: [-1, -2, -3]


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