Listedeki her bir öğeyi bir sayıyla nasıl çarparım?


Yanıtlar:


133

Sadece bir liste anlayışı kullanabilirsiniz:

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]

Bir liste anlamanın genellikle bir fordöngü oluşturmanın daha verimli bir yolu olduğunu unutmayın :

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

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

Alternatif olarak, popüler Pandas paketini kullanan bir çözüm:

import pandas as pd

s = pd.Series(my_list)

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

Veya sadece listeyi istiyorsanız:

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

Büyük harfle başlayan değişken adı Pythonic değildir. Ve bunlar listeler, sayılar değil. Bu yüzden kullanımını öneririm l1ve l2değişken adı olarak.
Casimir Kristal

4
Bir değişken olarak 'l'nin kullanılması da önerilmez çünkü' l 'harfi ve 1 rakamı kolayca karıştırılabilir. OP'nin orijinal sorusundaki değişkenleri kullandım ve soruyu düzenlemenizin yarardan çok zarar verdiğine inanıyorum.
Alexander

1
Düzenlememin kötü olduğunu düşünüyorsanız, iyileştirmek için soruyu düzenleyebilirsiniz. Ayrıca, diğer değişken yerine seçebilir l1gibi l_1, list_1Bunların tümü daha iyi vb Num_1.
Casimir Kristal

26

Çarpıcı bir şekilde daha hızlı bir yaklaşım, liste üzerinde döngü yapmak yerine çarpma işlemini vektörleştirilmiş bir şekilde yapmaktır. Numpy zaten bunun için kullanabileceğiniz çok basit ve kullanışlı bir yol sağladı.

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

Bunun Python'un yerel listeleriyle çalışmadığını unutmayın. Bir sayıyı bir listeyle çarparsanız, o sayının büyüklüğü kadar olan öğeleri tekrarlar.

In [15]: my_list *= 1000

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

Bir liste anlama kullanarak saf Python tabanlı bir yaklaşım istiyorsanız, temelde gidilecek en Pythonic yoldur.

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]

Liste anlamanın yanı sıra, tamamen işlevsel bir yaklaşım olarak, yerleşik map()işlevi aşağıdaki gibi de kullanabilirsiniz :

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

Bu kod, içinde tüm öğeleri geçer my_listiçin 5bireyin __mul__yöntem ve geri dönüş bir yineleyici benzer bir objeye (piton-3.x). Daha sonra list()yerleşik işlevi kullanarak yineleyiciyi listeye dönüştürebilirsiniz (Python-2.x'te buna ihtiyacınız yoktur çünkü mapvarsayılan olarak bir liste döndürür).

kıyaslamalar:

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)

Uyuşuk yöntemin neden 'son derece hızlı' olduğunu merak ediyorum? Biraz ayrıntı verebilir misiniz veya beni bazı kaynaklara yönlendirebilir misiniz? Vektörizasyonun ne olduğundan emin değilim.
Aerinmund Fagelson

1
@AerinmundFagelson Burada -> stackoverflow.com/questions/35091979/…
Kasravnd

@Kasramvd Bu bağlantı yanlış. Bağlantı, vektörleştirmenin farklı bir anlamını tek talimatlı çoklu veri olarak tartışır (GPU'ların yaptığı gibi aynı anda birçok veriye bir işlem uygulama). Numpy bağlamında, vectorization oldukça saf Python değil, bir veri dizisine çalıştırmak için hızlı önceden derlenmiş C döngüleri kullanarak belirtmektedir.
xjcl


19

Bunu yerinde şu şekilde yapabilirsiniz:

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

Bu, ek ithalat gerektirmez ve çok pitoniktir.


Ek olarak: Konsept, hakkında daha fazla bilgi aramak istiyorsanız, liste anlama olarak adlandırılır .
Michael

1
Daha doğrusu olur l = [x * 5 for x in l]üzerinde l[:] = [x * 5 for x in l]. İkincisi yeni bir liste oluşturur lve daha ucuz olan referansı yeniden atamak yerine içeriğinin üzerine yazmak için kullanır . Uzay hakkında gerçekten endişeleniyorsanız, sadece bir döngü ile yineleyin ve yerinde mutasyon yapın.
cs95

6

Python'da yeni olduğunuzu düşündüğüm için, uzun yoldan gidelim, for döngüsünü kullanarak listenizi yineleyin ve her öğeyi çarpın ve yeni bir listeye ekleyin.

for döngüsü kullanmak

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

Liste anlama kullanıldığında, bu aynı zamanda for-döngüsü kullanmakla aynıdır, ancak daha 'pitonik'

lst = [5, 20 ,15]

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

"Uzun yol" nasıl daha iyi? Daha uzun - dolayısıyla okumak daha zor - ve yazmak hiç de kolay değil.
lirtosiast

1
tamam belki başlığımla ilgili yanlış bir izlenim edinmişsinizdir ve daha iyi olduğunu hiç söylemedim, sadece anlamadan ona nasıl yapılacağını göstermeye çalıştım. çünkü python'da yeniyken deneyimime göre anlama kavramını kolayca kavrayamadım.
wasp8898

Tamam. Doğrudan ilişki kuramıyorum çünkü işlevsel dillerle başladım.
lirtosiast

Orada iyi görüyorum. Yanıtı, bunu yapmanın verimli yolunu da içerecek şekilde düzenledim.
wasp8898

4

Harita ile (o kadar iyi değil, ancak soruna başka bir yaklaşım):

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

ayrıca, numpy veya numpy diziler kullanıyorsanız, şunu kullanabilirsiniz:

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

Neden timesfive işlevini tanımlamak yerine bir lambda kullanmıyoruz?
Vimanyu

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

bunu yapmanın bir yolu ... öğretmeniniz muhtemelen sınıfta anlatılan çok daha az karmaşık bir yolu biliyordur


Bunu bir lambda ifadesi kullanarak içe aktarma deyimleri olmadan yapabilirsiniz. Ayrıca, snippet'iniz bir listeye dönüştürülmedikçe işe yaramayan bir harita nesnesi döndürür. liste (harita (lambda x: 5 * x, my_list)).
castle-bravo

@ castle-bravo kullanışlılığı onunla ne yapmanız gerektiğine bağlı ... bu çözümü gerçekleştirmenin birçok yolu var (bahsettiğim gibi ...)
Joran Beasley 3'16

4
Kullanmamaya öğretme insanları Lütfen mapile lambda; a ihtiyacınız olduğu anda lambda, bir liste anlama veya oluşturucu ifade ile daha iyi durumda olurdunuz. Zeki olduğunu varsa, olabilir yapmak mapolmadan çalışmalarını lambdabu durumda örneğin sa sürü,map((5).__mul__, my_list) , bu özel durumda, basit için bayt kod tercüman bazı optimizasyonlar sayesinde rağmen intmatematik, [x * 5 for x in my_list]hızlıdır, hem de varlık fazla Pythonic ve daha basit .
ShadowRanger

1

Her bir elemanın çarpımı my_listile k:

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

sonuçlanan: [5, 10, 15, 20]


-1

En iyi yol, liste anlamayı kullanmaktır:

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

Şunu döndürür: [-1, -2, -3]


Bu sadece kabul edilen cevabı alır ve onu bir işleve dönüştürür. Bunu muhtemelen SO'daki yanıtların yarısından fazlasıyla yapabilirsiniz, ancak bu hiçbir şey eklemiyor ve OP'nin istediği şey değil.
Alexander
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.