У мене є список:
my_list = [1, 2, 3, 4, 5]
Як я можу помножити кожен елемент my_listна 5? Результат повинен бути:
[5, 10, 15, 20, 25]
У мене є список:
my_list = [1, 2, 3, 4, 5]
Як я можу помножити кожен елемент my_listна 5? Результат повинен бути:
[5, 10, 15, 20, 25]
Відповіді:
Ви можете просто використовувати розуміння списку:
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як ім'я змінної.
l1таку як l_1, list_1і т. Д. Це все краще, ніж Num_1.
Надзвичайно швидший підхід полягає у виконанні множення векторизованим способом, а не в циклічному перегляді списку. 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)
Ви можете зробити це на місці так:
l = [1, 2, 3, 4, 5]
l[:] = [x * 5 for x in l]
Це не вимагає додаткового імпорту і є дуже пітонічним.
l = [x * 5 for x in l]закінчити l[:] = [x * 5 for x in l]. Останній створює новий список, а потім використовує його для перезапису вмісту, на lвідміну від простого перепризначення посилання, яке дешевше. Якщо вас насправді турбує простір, просто повторіть цикл і мутуйте на місці.
Оскільки я думаю, що ви новачок у 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
З картою (не так добре, але інший підхід до проблеми):
list(map(lambda x: x*5,[5, 10, 15, 20, 25]))
також, якщо ви випадково використовуєте масиви numpy або numpy, ви можете використовувати це:
import numpy as np
list(np.array(x) * 5)
from functools import partial as p
from operator import mul
map(p(mul,5),my_list)
це один із способів зробити це ... ваш вчитель, мабуть, знає набагато менш складний спосіб, про який, мабуть, говорили в класі
mapз lambda; як тільки вам знадобиться lambda, вам було б краще з розумінням списку або виразом генератора. Якщо ви розумні, ви можете зробити mapроботу без lambdaбагато, наприклад, у цьому випадку, map((5).__mul__, my_list)хоча в цьому конкретному випадку, завдяки деяким оптимізаціям інтерпретатора байтового коду для простої intматематики, [x * 5 for x in my_list]це швидше, а також є більш пітонічним та простішим .
Найкращий спосіб - використовувати розуміння списку:
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]
mapкраще, ніжfor-loop.