আমি কীভাবে তালিকার প্রতিটি উপাদানকে সংখ্যার দ্বারা গুণ করব?


92

আমার একটি তালিকা আছে:

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

আমি কীভাবে প্রতিটি উপাদানকে my_list5 দিয়ে গুণতে পারি ? আউটপুটটি হওয়া উচিত:

[5, 10, 15, 20, 25]

4
ব্যবহার করার mapচেয়ে ভাল for-loop
টনি

উত্তর:


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]

বিকল্প হিসাবে, জনপ্রিয় পান্ডাস প্যাকেজ ব্যবহার করে একটি সমাধান এখানে দেওয়া হয়েছে:

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' বর্ণটি এবং 1 নম্বরটি সহজেই বিভ্রান্ত হয়। আমি ওপির মূল প্রশ্নে ভেরিয়েবলগুলি ব্যবহার করেছি এবং আমি বিশ্বাস করি যে আপনার প্রশ্নের সম্পাদনা ভালের চেয়ে বেশি ক্ষতি করেছে।
আলেকজান্ডার

4
আপনি যদি আমার সম্পাদনাটি খারাপ বলে মনে করেন তবে আপনি এটির উন্নতি করতে প্রশ্নটি সম্পাদনা করতে পারেন। এছাড়াও, আমরা বদলে অন্য পরিবর্তনশীল নির্বাচন করতে পারবেন l1যেমন l_1, list_1ইত্যাদি এগুলি সব চেয়ে ভাল Num_1
ক্যাসিমির ক্রিস্টাল

26

একটি সুস্পষ্ট দ্রুত পদ্ধতির তালিকাটি লুপিংয়ের পরিবর্তে ভেক্টরাইজড পদ্ধতিতে গুণ করা। নম্পি এর জন্য ইতিমধ্যে খুব সহজ এবং সহজ উপায় সরবরাহ করেছেন যা আপনি ব্যবহার করতে পারেন।

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

দ্রষ্টব্য যে এটি পাইথনের নেটিভ তালিকার সাথে কাজ করে না। আপনি যদি কোনও সংখ্যাকে একটি তালিকা দিয়ে গুণ করেন তবে এটি সেই সংখ্যার আকার হিসাবে আইটেমগুলিকে পুনরাবৃত্তি করবে।

In [15]: my_list *= 1000

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

আপনি যদি একটি তালিকা বোধগম্যতা ব্যবহার করে একটি খাঁটি পাইথন-ভিত্তিক পন্থা চান তবে মূলত সবচেয়ে অজগর উপায় way

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'র __mul__পদ্ধতি এবং আয় কোনো ইটারেটরে মত বস্তু (পাইথন-3.x মধ্যে)। তারপরে আপনি list()বিল্ট ইন ফাংশনটি ব্যবহার করে পুনরাবৃত্তিকে তালিকায় রূপান্তর করতে পারেন (পাইথন -২.এক্সে আপনার প্রয়োজন নেই কারণ 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)

আমি আগ্রহী যে কেন নম্পুটি পদ্ধতিটি 'তীব্রভাবে দ্রুত' হয়? আপনি কি কিছু সংখ্যক সংস্থার দিকে বিস্তারিত বা বর্ণনা করতে পারেন? ভেক্টরাইজেশন কী তা আমি নিশ্চিত নই।
অ্যারিনমুন্ড ফাগেলসন

4
এখানে @AerinmundFagelson -> stackoverflow.com/questions/35091979/...
Kasravnd

@ কাসরামভিডি এই লিঙ্কটি ভুল। লিঙ্কটি একক-নির্দেশনা-মাল্টিপল-ডেটা হিসাবে ভেক্টরাইজেশনের একটি পৃথক অর্থ নিয়ে আলোচনা করে (জিপিইউগুলির মতো একই সাথে অনেকগুলি ডেটার অপারেশন প্রয়োগ করে)। নম্পপি প্রসঙ্গে, ভেক্টরাইজেশন বলতে বোঝায় খাঁটি পাইথনের পরিবর্তে ডেটা সিকোয়েন্সে চালিত করতে দ্রুত প্রাক-সংকলিত সি লুপগুলি ব্যবহার করা।
xjcl


19

আপনি এটি এ জাতীয় জায়গায় করতে পারেন:

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

এটির জন্য কোনও অতিরিক্ত আমদানির প্রয়োজন নেই এবং এটি খুব পাইথোনিক।


এছাড়াও: যদি আপনি এ সম্পর্কিত আরও তথ্য সন্ধান করতে চান তবে ধারণাকে তালিকা অনুধাবন বলা হয় ।
মাইকেল

4
আমি বরং l = [x * 5 for x in l]শেষ l[:] = [x * 5 for x in l]। পরেরটি একটি নতুন তালিকা তৈরি করে, তারপরে এটি lকেবলমাত্র রেফারেন্সকে সস্তার তুলনায় সস্তা হিসাবে সামগ্রীর ওভাররাইট করতে ব্যবহার করে overw আপনি যদি স্থান সম্পর্কে আসলেই উদ্বিগ্ন থাকেন তবে কেবল একটি লুপ দিয়ে পুনরাবৃত্তি করুন এবং জায়গায় স্থান পরিবর্তন করুন।
cs95

6

যেহেতু আমি মনে করি আপনি পাইথনের সাথে নতুন, তাই লুপের জন্য ব্যবহার করে আপনার তালিকার মাধ্যমে পুনরাবৃত্তি করুন এবং প্রতিটি উপাদানকে একটি নতুন তালিকায় যুক্ত করুন।

লুপ জন্য ব্যবহার করে

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

তালিকার বোধগম্যতা ব্যবহার করে এটি ফোর-লুপ ব্যবহার করার মতো তবে আরও 'পাইথোনিক'

lst = [5, 20 ,15]

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

"দীর্ঘ পথ" কোনওভাবে কীভাবে আরও ভাল? এটি আরও দীর্ঘ — এইভাবে পড়া আরও কঠিন — এবং সহজে লেখা সহজ নয়।
lirtosiast

4
ঠিক আছে হয়তো আপনি আমার শিরোনামে ভুল ধারণা পেয়েছিলেন এবং আমি কখনও বলিনি যে এটির চেয়ে ভাল ছিল, কেবল বোঝার ব্যবহার না করে কীভাবে এটি করা যায় তাকে দেখাতে চেষ্টা করে। কারণ আমার অভিজ্ঞতার ভিত্তিতে যখন আমি অজগরে নতুন ছিলাম তখন আমি সহজেই বোঝার ধারণাটি উপলব্ধি করতে পারিনি।
wasp8898

ওহ ঠিক আছে. আমি সরাসরি সম্পর্কিত করতে পারি না কারণ আমি কার্যকরী ভাষা দিয়ে শুরু করেছি।
lirtosiast

আমি দেখছি, ভাল আছে। আমি উত্তরটি সম্পাদনা করেছি যাতে এটি করার দক্ষ উপায়ও অন্তর্ভুক্ত থাকে।
wasp8898

4

মানচিত্র সহ (ততটা ভাল নয়, তবে সমস্যার আরেকটি উপায়):

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

এছাড়াও, যদি আপনি ন্যালি বা ছদ্মবেশী অ্যারে ব্যবহার করে থাকেন তবে আপনি এটি ব্যবহার করতে পারেন:

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

টাইমসাইভ ফাংশন সংজ্ঞায়নের পরিবর্তে ল্যাম্বডা ব্যবহার করবেন না কেন?
বিমানু

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

আপনি এটি করতে পারেন এমন এক উপায় ... আপনার শিক্ষক সম্ভবত ক্লাসে আচ্ছাদিত এমন অনেক কম জটিল উপায় জানেন


ল্যাম্বদা এক্সপ্রেশন ব্যবহার করে আমদানি বিবৃতি ছাড়াই আপনি এটি করতে পারেন। এছাড়াও, আপনার স্নিপেট একটি মানচিত্রের অবজেক্ট ফেরত দেয়, যা তালিকায় না ছড়িয়ে দেওয়া অকেজো। তালিকা (মানচিত্র (ল্যাম্বদা এক্স: 5 * এক্স, মাই_লিস্ট))
দুর্গ-ব্রাভো

@ দুর্গ-ব্র্যাভো এর কার্যকারিতা নির্ভর করে আপনার এটির কী করা দরকার ... এই সমাধানটি করার অনেকগুলি উপায় রয়েছে (যেমন আমি উল্লেখ করছি ...)
জোড়ান ব্যাসলি

4
ব্যবহার করতে শেখান মানুষ না দয়া করে mapসঙ্গে lambda; তাত্ক্ষণিক আপনার প্রয়োজন হয় lambda, আপনি তালিকা বোধগম্যতা বা জেনারেটর এক্সপ্রেশন দিয়ে আরও ভাল। যদি তুমি চালাক, আপনি করতে পারেন করা mapছাড়া কাজ lambdaএই ক্ষেত্রে, ইন SA অনেক, যেমন map((5).__mul__, my_list), যদিও এই বিশেষ ক্ষেত্রে, সহজ জন্য বাইট কোড অনুবাদক মধ্যে কিছু অপ্টিমাইজেশন ধন্যবাদ intগণিত, [x * 5 for x in my_list], দ্রুততর এবং সেইসাথে হচ্ছে আরো Pythonic এবং সহজ ।
শ্যাডোর্যাঞ্জার

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]


এটি কেবল গ্রহণযোগ্য উত্তর নেয় এবং এটিকে একটি কার্যক্রমে রূপান্তরিত করে। আপনি সম্ভবত এসও-তে অর্ধেকেরও বেশি প্রতিক্রিয়া নিয়ে এটি করতে পারেন তবে এটি কোনও কিছুই যোগ করে না এবং ওপি যা বলেছিল তা নয়।
আলেকজান্ডার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.