যেখানে পাইথনে একইরকম রয়ে গেছে সেখানে মানচিত্রের কার্যকারিতাটিতে একাধিক যুক্তি কীভাবে করবেন?


155

আসুন আমাদের নীচের মত একটি ফাংশন অ্যাড আছে বলুন

def add(x, y):
    return x + y

আমরা অ্যারের জন্য মানচিত্র ফাংশন প্রয়োগ করতে চাই

map(add, [1, 2, 3], 2)

শব্দার্থবিজ্ঞানগুলি হ'ল আমি অ্যারের প্রতিটি উপাদানগুলিতে 2 যুক্ত করতে চাই। তবে mapফাংশনটির তৃতীয় যুক্তিতেও একটি তালিকা প্রয়োজন।

দ্রষ্টব্য: আমি সরলতার জন্য অ্যাড উদাহরণ দিচ্ছি। আমার মূল কাজটি আরও জটিল। এবং অবশ্যই yঅ্যাড ফাংশনের ডিফল্ট মান নির্ধারণের বিকল্পটি প্রশ্নের বাইরে নয় কারণ এটি প্রতিটি কলের জন্য পরিবর্তিত হবে।


20
এটি লিস্পের মতোই: map(add,[1,2,3],[2]*3) সাধারণভাবে mapকোনও ফাংশনটিকে তার প্রথম যুক্তি হিসাবে গ্রহণ করে, এবং যদি এই ফাংশনটি কে আর্গুমেন্ট গ্রহণ করে, আপনি কে পুনরাবৃত্তির সাথে অনুসরণ করতে হবে :addTriple(a,b,c) -> map(addTriple,[...],[...],[...])
ওয়াটিশিউন

উত্তর:


188

একটি বিকল্প তালিকা বোধগম্যতা:

[add(x, 2) for x in [1, 2, 3]]

আরও বিকল্প:

a = [1, 2, 3]

import functools
map(functools.partial(add, y=2), a)

import itertools
map(add, a, itertools.repeat(2, len(a)))

1
হ্যাঁ, তবে মানচিত্রের ফাংশনের তুলনায় এটি কতটা দ্রুত?
শান

@Shan: অত্যন্ত অনুরূপ, বিশেষ করে যদি add()একটি অ-তুচ্ছ ফাংশন
সেভেন Marnach

2
@ শান: এক্ষেত্রে নম্পপিকে দেখুন। যদি এটি সত্যিই আপনার জন্য সমস্যা হয় তবে তালিকা বোঝার মধ্যে গতির পার্থক্য এবং কোনওভাবেই map()সহায়তা করবে না।
সোভেন মারনাচ

3
@ শান: যেমনটি আগেই বলেছি, নম্পপিকে দেখুন। এটি লুপগুলি যথাযথভাবে গতিতে সহায়তা করতে পারে তবে শর্ত থাকে যে তারা ভেক্টরাইজড হতে পারে।
সোভেন মারনাচ

1
@ বার্নার্ট: ওপি পাইথন 2 বা 3 ব্যবহার করছে কিনা তা স্পষ্ট নয় উদাহরণটি পাইথন 2 তে কাজ করে তা নিশ্চিত করার জন্য, আমি প্যারামিটারটি অন্তর্ভুক্ত করেছি। (দ্রষ্টব্য যে পাইথন 2 এর map()মতো আচরণ করে zip_longest(), যখন এটি zip()পাইথন 3-এর মতো আচরণ করে ))
সোভেন মার্নাচ

60

দস্তাবেজগুলি স্পষ্টভাবে পরামর্শ দেয় এটির জন্য এটি প্রধান ব্যবহার itertools.repeat:

এমন একটি পুনরুক্তি তৈরি করুন যা বারবার প্রত্যাবর্তন করে। সময় আর্গুমেন্ট নির্দিষ্ট না করা অবধি অনির্দিষ্টকালের জন্য চলে। map()ডাকা ফাংশনটিতে আক্রমণকারী পরামিতিগুলির পক্ষে যুক্তি হিসাবে ব্যবহৃত হয় । zip()একটি রেকর্ড রেকর্ডের একটি আক্রমণকারী অংশ তৈরি করতে এর সাথেও ব্যবহৃত হয় ।

এবং যুক্তি len([1,2,3])হিসাবে পাস করার কোন কারণ নেই times; mapপ্রথম পুনরাবৃত্তীয় গ্রাস হওয়ার সাথে সাথেই থেমে যায়, সুতরাং একটি অসীম পুনরাবৃত্তি পুরোপুরি ঠিক:

>>> from operator import add
>>> from itertools import repeat
>>> list(map(add, [1,2,3], repeat(4)))
[5, 6, 7]

প্রকৃতপক্ষে, repeatডক্সের ক্ষেত্রে এটি উদাহরণের সমান :

>>> list(map(pow, range(10), repeat(2)))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

এটি একটি অলস-কার্যকরী-ভাষা-y সমাধানের জন্য তৈরি করে যা পাইথন-পুনরুক্তির পদগুলিতেও পুরোপুরি পঠনযোগ্য।


2
+1 এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। এটি কিছু ধ্রুবক এবং অন্যদের তালিকা বা জেনারেটর সহ অবশ্যই কোনও সংখ্যক পরামিতি পর্যন্ত প্রসারিত। যেমন: def f(x,y,z): \\ return '.'.join([x,y,z])এবং তারপরে: list(map(f, list('abc'), repeat('foo'), list('defgh')))ফেরত দেয় ['a.foo.d', 'b.foo.e', 'c.foo.f']
পিয়েরে ডি

5
পাইথন 2-তে, দৈর্ঘ্যের আর্গুমেন্টটি সরবরাহ করা প্রয়োজন repeat(), যেহেতু পাইথনের সেই সংস্করণে দীর্ঘতম পুনরাবৃত্তকারী শেষ না map()হওয়া অবধি সমস্ত অনুপস্থিত মান পূরণ করবে run প্যারামিটারটি পাস করার "কারণ নেই" বলাই ভুল। None
সোভেন মারনাচ

@ স্যভেনমার্নচের মন্তব্যটি গৌণ নয়: পাইথন 3 এবং পাইথন 2 এর আচরণে ব্যাপক পরিবর্তন হয়!
আগস্টন

36

একটি তালিকা বোধগম্যতা ব্যবহার করুন।

[x + 2 for x in [1, 2, 3]]

আপনি যদি সত্যিই , সত্যিই , সত্যিই ব্যবহার করতে চান map, এটা প্রথম আর্গুমেন্ট হিসাবে একটি বেনামী ফাংশন দিতে:

map(lambda x: x + 2, [1,2,3])

16

মানচিত্রে একাধিক যুক্তি থাকতে পারে, মানক উপায়

map(add, a, b)

আপনার প্রশ্নে এটি হওয়া উচিত

map(add, a, [2]*len(a))

নিশ্চিত নয় যে তার প্রশ্নের অর্থ কী ছিল তবে আমি মনে করি অ্যাড 2 মান গ্রহণ করি এবং সেগুলি 2 স্থির নয় এবং ব্যবহারকারী হিসাবে আসা উচিত যেমন আরজি 1 আসছে। সুতরাং এই ক্ষেত্রে মানচিত্রের অধীনে আমাদের কীভাবে অ্যাড (x, y) বলা উচিত?
বিমলেশ শর্মা

15

সঠিক উত্তরটি আপনার ভাবার চেয়ে সহজ। সহজভাবে করুন:

map(add, [(x, 2) for x in [1,2,3]])

এবং অ্যাড বাস্তবায়ন পরিবর্তনের জন্য একটি টুপল গ্রহণ

def add(t):
   x, y = t
   return x+y

এটি যে কোনও জটিল ব্যবহারের ক্ষেত্রে পরিচালনা করতে পারে যেখানে দুটি অ্যাড প্যারামিটার গতিশীল।


14

কখনও কখনও আমি অনুরূপ পরিস্থিতি সমাধান করেছি (যেমন ব্যবহারের মতো প্যান্ডাস.প্লাই পদ্ধতি ব্যবহার করে) ক্লোজার ব্যবহার করে

এগুলি ব্যবহার করার জন্য, আপনি কোনও ফাংশনটি সংজ্ঞায়িত করেন যা আপনার কার্যকারিতার জন্য গতিময়ভাবে সংজ্ঞা দেয় এবং একটি মোড়ক দেয়, কার্যকরভাবে কোনও একটি পরামিতিকে স্থির করে তোলে।

এটার মতো কিছু:

def add(x, y):
   return x + y

def add_constant(y):
    def f(x):
        return add(x, y)
    return f

তারপরে, add_constant(y)একটি ফাংশন প্রদান করে যা যুক্ত করতে ব্যবহৃত হতে পারেy কোনও প্রদত্ত মান :

>>> add_constant(2)(3)
5

যা আপনাকে যে কোনও পরিস্থিতিতে যেখানে প্যারামিটারগুলি একবারে একটি দেওয়া হয়েছিল তা ব্যবহার করতে দেয়:

>>> map(add_constant(2), [1,2,3])
[3, 4, 5]

সম্পাদন করা

আপনি যদি অন্য কোথাও ক্লোজার ফাংশনটি লিখতে না চান, আপনার কাছে সর্বদা ল্যাম্বডা ফাংশনটি ব্যবহার করে ফ্লাইতে তৈরি করার সম্ভাবনা থাকে:

>>> map(lambda x: add(x, 2), [1, 2, 3])
[3, 4, 5]

13

আপনার যদি এটি উপলভ্য থাকে তবে আমি নম্পটি ব্যবহারের বিষয়ে বিবেচনা করব এই ধরণের অপারেশনের জন্য এটি খুব দ্রুত:

>>> import numpy
>>> numpy.array([1,2,3]) + 2
array([3, 4, 5])

এটি ধরে নিচ্ছে যে আপনার আসল প্রয়োগটি গাণিতিক ক্রিয়াকলাপ করছে (এটি ভেক্টরাইজড হতে পারে)।


10

যদি আপনাকে সত্যিই মানচিত্রের ফাংশনটি ব্যবহার করতে হয় (এখানে আমার শ্রেণীর নিয়োগের মতো ...), আপনি 1 টি যুক্তি সহ একটি র‌্যাপার ফাংশন ব্যবহার করতে পারেন, বাকীটি তার দেহের মূল অংশে রেখে; অর্থাত:

extraArguments = value
def myFunc(arg):
    # call the target function
    return Func(arg, extraArguments)


map(myFunc, itterable)

নোংরা ও কুরুচিপূর্ণ, এখনও কৌশলটি করে


1
একটি বন্ধ, আমি মনে করি এটি কিছু যুক্ত করে, একটি যোগ করে। একটি আংশিক ফাংশন অনুরূপ, গৃহীত উত্তর আছে।
অ্যারন হল

1
myFuncদরকারreturn Func(arg, extraArguments)
দুপুর ২ টা

আমি @ পিএম 2 রিং সংশোধন করে দাঁড়িয়েছি, এটি সত্য; কোড আপডেট।
টডর মিনাকভ

ফানক সংজ্ঞায়িত হয় কোথায়? কারণ আমি ফুনকের জন্য একটি নাম ত্রুটি পাচ্ছি
নিখিল মিশ্র

Funcআপনার মূল ফাংশনটির নাম - ওপি টাইট addউদাহরণস্বরূপ হবে
টডর মিনাকভ

6

আমার বিশ্বাস স্টারম্যাপটি আপনার যা প্রয়োজন:

from itertools import starmap


def test(x, y, z):
    return x + y + z

list(starmap(test, [(1, 2, 3), (4, 5, 6)]))

আপনার উদাহরণে টাইপ করুন: তালিকা (স্টারম্যাপ (পরীক্ষা, [(1, 2, 3), (4, 5, 6)])))
টিবু

হ্যাঁ. ধন্যবাদ :)
শিকি.ইয়াং

1

একটি mapফাংশনে একাধিক যুক্তি পাস করার জন্য ।

def q(x,y):
    return x*y

print map (q,range(0,10),range(10,20))

এখানে q একাধিক যুক্তির সাথে ফাংশন করে যা মানচিত্র () কল করে। উভয় ব্যাপ্তির দৈর্ঘ্য অর্থাৎ নিশ্চিত করুন

len (range(a,a')) and len (range(b,b')) are equal.

1

ভিতরে :nums = [1, 2, 3]

ভিতরে :map(add, nums, [2]*len(nums))

বাইরে:[3, 4, 5]


1
এটি প্রশ্নের উত্তর সরবরাহ করে না। আপনি অনুরূপ প্রশ্নগুলির জন্য অনুসন্ধান করতে পারেন , বা উত্তর খুঁজে পেতে পৃষ্ঠার ডানদিকের সম্পর্কিত এবং লিঙ্কযুক্ত প্রশ্নগুলি উল্লেখ করতে পারেন। আপনার যদি সম্পর্কিত তবে ভিন্ন প্রশ্ন থাকে তবে একটি নতুন প্রশ্ন জিজ্ঞাসা করুন এবং প্রসঙ্গটি সরবরাহ করতে সহায়তা করার জন্য এটির একটি লিঙ্ক অন্তর্ভুক্ত করুন। দেখুন: প্রশ্ন জিজ্ঞাসা করুন, উত্তরগুলি পান, কোনও
বিঘ্ন

1

আপনি মানচিত্রের সাথে ল্যাম্বদা অন্তর্ভুক্ত করতে পারেন:

list(map(lambda a: a+2, [1, 2, 3]))

1
def func(a, b, c, d):
 return a + b * c % d
map(lambda x: func(*x), [[1,2,3,4], [5,6,7,8]])

একটি ল্যাম্বদা দিয়ে ফাংশন কলটি মোড়ানো এবং স্টার আনপ্যাকটি ব্যবহার করে, আপনি নির্বিচারে সংখ্যক যুক্তি দিয়ে মানচিত্রটি করতে পারেন।


ল্যাম্বদা খুব ধীর, পরিবর্তে ফান্টুলগুলি ব্যবহার করুন
ওয়াং

0

আরেকটি বিকল্প হ'ল:

results = []
for x in [1,2,3]:
    z = add(x,2)
    ...
    results += [f(z,x,y)]

একাধিক ফাংশন কল করার সময় এই ফর্ম্যাটটি খুব কার্যকর।

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