목록의 각 요소에 숫자를 어떻게 곱합니까?


답변:


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]

대문자로 시작하는 변수 이름은 Pythonic이 아닙니다. 그리고 그것들은 숫자가 아니라 목록입니다. 그래서 변수 이름으로 l1및 사용을 제안합니다 l2.
카시미르 크리스탈

4
'l'을 변수로 사용하는 것도 권장하지 않습니다. 문자 'l'과 숫자 1이 쉽게 혼동되기 때문입니다. 나는 OP의 원래 질문에서 변수를 사용했으며 질문에 대한 편집이 좋은 것보다 더 해로웠다 고 생각합니다.
Alexander

1
내 편집이 나쁘다고 생각되면 질문을 편집하여 개선 할 수 있습니다. 또한, 우리는 다른 변수가 아니라 선택할 수있는 l1l_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 기반 접근 방식을 원한다면 기본적으로 가장 Pythonic 방법입니다.

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_listto 5__mul__메서드 내의 모든 항목을 전달 하고 반복기 같은 객체 (python-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 방법이 '매우 빠른'이유에 관심이 있습니까? 좀 더 자세히 설명해 주시거나 자료를 알려 주시겠습니까? 벡터화가 무엇인지 잘 모르겠습니다.
Aerinmund Fagelson

1
@AerinmundFagelson 여기에-> stackoverflow.com/questions/35091979/…
Kasravnd

@Kasramvd 링크가 잘못되었습니다. 링크는 단일 명령어 다중 데이터 (GPU처럼 한 번에 여러 데이터에 작업 적용)와 같은 벡터화 의 다른 의미에 대해 설명합니다 . NumPy의 맥락에서 벡터화 는 순수한 Python이 아닌 데이터 시퀀스에서 작동하기 위해 사전 컴파일 된 빠른 C 루프를 사용하는 것을 의미합니다.
xjcl


19

다음과 같이 제자리에서 할 수 있습니다.

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

이것은 추가 수입이 필요하지 않으며 매우 비단뱀입니다.


또한 개념 에 대한 자세한 정보를 찾으려면 목록 이해 라고 합니다.
Michael

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 루프를 사용하는 것과 동일하지만 더 'pythonic'

lst = [5, 20 ,15]

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

어떻게 "긴 길"이 더 낫습니까? 더 길어서 읽기가 더 어렵고 쓰기가 더 쉽지 않습니다.
lirtosiast

1
좋아, 아마 당신이 내 제목에 대해 잘못된 인상을 받았을 수도 있고, 더 나아 졌다고 말한 적이 없었습니다. 그저 이해력을 사용하지 않고 그에게 그것을하는 방법을 보여 주려고했습니다. 왜냐하면 내가 파이썬을 처음 접했을 때 나는 이해의 개념을 쉽게 이해할 수 없었기 때문입니다.
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)

당신이 할 수있는 한 가지 방법입니다 ... 당신의 선생님 은 아마도 수업에서 다루었던 훨씬 덜 복잡한 방법을 알고 있을 것입니다.


람다 식을 사용하여 import 문 없이도 할 수 있습니다. 또한 스 니펫은 목록으로 캐스트하지 않으면 쓸모가없는지도 객체를 반환합니다. list (map (lambda x : 5 * x, my_list)).
castle-bravo

@ castle-bravo 그것의 유용성은 당신이 그것으로 무엇을해야하는지에 달려 있습니다 ...이 솔루션을 달성하는 많은 방법이 있습니다 (제가 언급
했듯이

4
map함께 사용하도록 사람들을 가르치지 마십시오 lambda. 를 필요로하는 즉시 lambda목록 이해 또는 생성기 표현식을 사용하는 것이 좋습니다. 당신이 영리하다면, 당신 수 있습니다 있도록 map없이 작업 lambda이 경우, SA의 예를 들어, 많은을 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가 요청한 것이 아닙니다.
Alexander
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.