Nazwa zmiennej zaczynająca się od wielkich liter nie jest Pythonic. Są to listy, a nie liczby. Dlatego sugerowałbym użycie l1i l2jako nazwy zmiennej.
Casimir Crystal
4
Używanie „l” jako zmiennej jest również odradzane, ponieważ literę „l” i cyfrę 1 można łatwo pomylić. Użyłem zmiennych w pierwotnym pytaniu PO i uważam, że Twoja zmiana pytania przyniosła więcej szkody niż pożytku.
Alexander,
1
Jeśli uważasz, że moja zmiana jest zła, możesz edytować pytanie, aby je poprawić. Ponadto, możemy wybrać inną zmienną, a nie l1takie jak l_1, list_1itd wszystkie one są lepsze niż Num_1.
Casimir Crystal
26
Oszałamiająco szybszym podejściem jest wykonywanie mnożenia w sposób zwektoryzowany zamiast zapętlania listy. Numpy zapewnił już bardzo prosty i poręczny sposób, z którego możesz skorzystać.
Zauważ, że to nie działa z natywnymi listami Pythona. Jeśli pomnożymy liczbę przez listę, powtórzy się ona jako wielkość tej liczby.
In [15]: my_list *= 1000
In [16]: len(my_list)
Out[16]: 5000
Jeśli chcesz, aby podejście oparte na Pythonie było oparte na zrozumieniu list, jest to w zasadzie najbardziej Pythonowa droga.
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]
Oprócz rozumienia list, jako czysto funkcjonalnego podejścia, możesz również użyć funkcji wbudowanej w map()następujący sposób:
In [10]: list(map((5).__mul__, my_list))
Out[10]: [5, 10, 15, 20, 25]
Kod ten przechodzi wszystkich elementów wchodzących w my_listto 5„s __mul__sposobu i powraca iterację jak przedmiotu (w pytona-3.x). Następnie możesz przekonwertować iterator na listę za pomocą list()wbudowanej funkcji (w Pythonie-2.x nie potrzebujesz tego, ponieważ mapdomyślnie zwraca listę).
testy porównawcze:
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 * 5899 µs ± 4.98 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Interesuje mnie, dlaczego metoda numpy jest „niesamowicie szybsza”? Czy mógłbyś rozwinąć coś więcej lub wskazać mi jakieś zasoby? Nie jestem pewien, czym jest wektoryzacja.
@Kasramvd Ten link jest nieprawidłowy. Odnośnik omawia inne znaczenie wektoryzacji jako pojedynczej instrukcji - wiele danych (zastosowanie operacji do wielu danych jednocześnie, tak jak robią to GPU). W kontekście NumPy wektoryzacja odnosi się do używania szybkich, wstępnie skompilowanych pętli C do działania na sekwencji danych, a nie czystego Pythona.
Ponadto: pojęcie to nazywa się zrozumieniem listy, jeśli chcesz znaleźć więcej informacji na jego temat.
Michael
1
Wolałbym l = [x * 5 for x in l]się l[:] = [x * 5 for x in l]. Ten ostatni tworzy nową listę, a następnie używa jej do nadpisania zawartości lzamiast po prostu ponownego przypisania odniesienia, co jest tańsze. Jeśli naprawdę martwisz się o przestrzeń, po prostu wykonaj iterację za pomocą pętli i dokonaj mutacji w miejscu.
cs95
6
Ponieważ myślę, że jesteś nowy w Pythonie, zróbmy długą drogę, iteruj listę za pomocą pętli for i mnóż i dołączaj każdy element do nowej listy.
używanie pętli for
lst = [5, 20 ,15]
product = []
for i in lst:
product.append(i*5)
print product
używając rozumienia list, jest to to samo co używanie pętli for, ale bardziej „pythonowe”
lst = [5, 20 ,15]
prod = [i * 5for i in lst]
print prod
W jaki sposób „długa droga” jest lepsza? Jest dłuższy - a więc trudniejszy do odczytania - i wcale nie łatwiejszy do napisania.
lirtosiast
1
okej, może odniosłeś złe wrażenie na moim tytule i nigdy nie powiedziałem, że jest lepiej, po prostu próbując pokazać mu, jak to zrobić, nie używając zrozumienia. ponieważ z mojego doświadczenia, kiedy byłem nowy w Pythonie, nie byłem w stanie łatwo pojąć pojęcia zrozumienia.
wasp8898
Och, dobrze. Nie mogę się bezpośrednio odnieść, ponieważ zacząłem od języków funkcjonalnych.
lirtosiast
Rozumiem, dobrze tam. Zredagowałem odpowiedź, aby uwzględnić również skuteczny sposób zrobienia tego.
wasp8898
4
Z mapą (nie tak dobre, ale inne podejście do problemu):
list(map(lambda x: x*5,[5, 10, 15, 20, 25]))
również, jeśli używasz tablic numpy lub numpy, możesz użyć tego:
Dlaczego nie użyć lambdy zamiast definiować funkcję pięciokrotną?
Vimanyu
2
from functools import partial as p
from operator import mul
map(p(mul,5),my_list)
to jeden ze sposobów, w jaki możesz to zrobić ... Twój nauczyciel prawdopodobnie zna znacznie mniej skomplikowany sposób, który prawdopodobnie był omawiany na zajęciach
Możesz to zrobić bez instrukcji importu, używając wyrażenia lambda. Ponadto, twój fragment zwraca obiekt mapy, który jest bezużyteczny, chyba że jest rzutowany na listę. list (map (lambda x: 5 * x, my_list)).
castle-bravo
@ castle-bravo jego użyteczność zależy od tego, co trzeba z nim zrobić ... istnieje wiele sposobów osiągnięcia tego rozwiązania (jak wspomniałem ...)
Joran Beasley
4
Proszę, nie uczcie ludzi używania mapz lambda; w momencie, gdy potrzebujesz lambda, byłoby lepiej, gdybyś użył rozumienia listy lub wyrażenia generatora. Jeśli jesteś mądry, to może uczynić mappracę bez lambdaLOT SA, na przykład w tym przypadku map((5).__mul__, my_list), chociaż w tym konkretnym przypadku, dzięki niektórych optymalizacje w interpreter kodu bajtowego dla prostej intmatematyki, [x * 5 for x in my_list]jest szybszy, jak również jest bardziej pythonowy i prostszej .
ShadowRanger
1
Mnożenie każdego elementu my_listprzez k:
k = 5
my_list = [1,2,3,4]
result = list(map(lambda x: x * k, my_list))
defmap_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))
To po prostu przyjmuje zaakceptowaną odpowiedź i zamienia ją w funkcję. Prawdopodobnie mógłbyś to zrobić z ponad połową odpowiedzi na SO, ale to nic nie dodaje i nie jest tym, o co prosił OP.
map
jest lepsze niżfor-loop
.map
(i zawsze lepsze, gdybymap
wymagało alambda
).Odpowiedzi:
Możesz po prostu użyć rozumienia listy:
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]
Zwróć uwagę, że rozumienie listy jest generalnie bardziej wydajnym sposobem wykonania
for
pętli:my_new_list = [] for i in my_list: my_new_list.append(i * 5) >>> print(my_new_list) [5, 10, 15, 20, 25]
Jako alternatywę przedstawiam rozwiązanie wykorzystujące popularny pakiet Pandy:
import pandas as pd s = pd.Series(my_list) >>> s * 5 0 5 1 10 2 15 3 20 4 25 dtype: int64
Lub, jeśli chcesz tylko listę:
>>> (s * 5).tolist() [5, 10, 15, 20, 25]
źródło
l1
il2
jako nazwy zmiennej.l1
takie jakl_1
,list_1
itd wszystkie one są lepsze niżNum_1
.Oszałamiająco szybszym podejściem jest wykonywanie mnożenia w sposób zwektoryzowany zamiast zapętlania listy. Numpy zapewnił już bardzo prosty i poręczny sposób, z którego możesz skorzystać.
>>> import numpy as np >>> >>> my_list = np.array([1, 2, 3, 4, 5]) >>> >>> my_list * 5 array([ 5, 10, 15, 20, 25])
Zauważ, że to nie działa z natywnymi listami Pythona. Jeśli pomnożymy liczbę przez listę, powtórzy się ona jako wielkość tej liczby.
In [15]: my_list *= 1000 In [16]: len(my_list) Out[16]: 5000
Jeśli chcesz, aby podejście oparte na Pythonie było oparte na zrozumieniu list, jest to w zasadzie najbardziej Pythonowa droga.
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]
Oprócz rozumienia list, jako czysto funkcjonalnego podejścia, możesz również użyć funkcji wbudowanej w
map()
następujący sposób:In [10]: list(map((5).__mul__, my_list)) Out[10]: [5, 10, 15, 20, 25]
Kod ten przechodzi wszystkich elementów wchodzących w
my_list
to5
„s__mul__
sposobu i powraca iterację jak przedmiotu (w pytona-3.x). Następnie możesz przekonwertować iterator na listę za pomocąlist()
wbudowanej funkcji (w Pythonie-2.x nie potrzebujesz tego, ponieważmap
domyślnie zwraca listę).testy porównawcze:
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)
źródło
Możesz to zrobić na miejscu w następujący sposób:
l = [1, 2, 3, 4, 5] l[:] = [x * 5 for x in l]
Nie wymaga to dodatkowego importu i jest bardzo pytoniczne.
źródło
l = [x * 5 for x in l]
sięl[:] = [x * 5 for x in l]
. Ten ostatni tworzy nową listę, a następnie używa jej do nadpisania zawartościl
zamiast po prostu ponownego przypisania odniesienia, co jest tańsze. Jeśli naprawdę martwisz się o przestrzeń, po prostu wykonaj iterację za pomocą pętli i dokonaj mutacji w miejscu.Ponieważ myślę, że jesteś nowy w Pythonie, zróbmy długą drogę, iteruj listę za pomocą pętli for i mnóż i dołączaj każdy element do nowej listy.
używanie pętli for
lst = [5, 20 ,15] product = [] for i in lst: product.append(i*5) print product
używając rozumienia list, jest to to samo co używanie pętli for, ale bardziej „pythonowe”
lst = [5, 20 ,15] prod = [i * 5 for i in lst] print prod
źródło
Z mapą (nie tak dobre, ale inne podejście do problemu):
list(map(lambda x: x*5,[5, 10, 15, 20, 25]))
również, jeśli używasz tablic numpy lub numpy, możesz użyć tego:
import numpy as np list(np.array(x) * 5)
źródło
from functools import partial as p from operator import mul map(p(mul,5),my_list)
to jeden ze sposobów, w jaki możesz to zrobić ... Twój nauczyciel prawdopodobnie zna znacznie mniej skomplikowany sposób, który prawdopodobnie był omawiany na zajęciach
źródło
map
zlambda
; w momencie, gdy potrzebujeszlambda
, byłoby lepiej, gdybyś użył rozumienia listy lub wyrażenia generatora. Jeśli jesteś mądry, to może uczynićmap
pracę bezlambda
LOT SA, na przykład w tym przypadkumap((5).__mul__, my_list)
, chociaż w tym konkretnym przypadku, dzięki niektórych optymalizacje w interpreter kodu bajtowego dla prostejint
matematyki,[x * 5 for x in my_list]
jest szybszy, jak również jest bardziej pythonowy i prostszej .Mnożenie każdego elementu
my_list
przezk
:k = 5 my_list = [1,2,3,4] result = list(map(lambda x: x * k, my_list))
w wyniku:
[5, 10, 15, 20]
źródło
Najlepszym sposobem jest rozumienie 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))
Zwraca: [-1, -2, -3]
źródło