মানচিত্রের কার্যকারিতা বোঝা


311
map(function, iterable, ...)

পুনরাবৃত্তিযোগ্য প্রতিটি আইটেমে ফাংশন প্রয়োগ করুন এবং ফলাফলগুলির একটি তালিকা ফেরত দিন। যদি অতিরিক্ত পুনরাবৃত্ত যুক্তিগুলি পাস করা হয় তবে ফাংশনটিতে অবশ্যই অনেকগুলি আর্গুমেন্ট গ্রহণ করা উচিত এবং সমান্তরালে সমস্ত পুনরাবৃত্ত থেকে আইটেমগুলিতে প্রয়োগ করা হবে।

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

যদি ফাংশনটি হয় Noneতবে পরিচয় ফাংশনটি ধরে নেওয়া হয়; যদি একাধিক যুক্তি থাকে, তবে map()সমস্ত পুনরাবৃত্তিযোগ্য (এক ধরণের ট্রান্সপোজ অপারেশন) থেকে সম্পর্কিত আইটেমযুক্ত টিপলস সমন্বিত একটি তালিকা দেয়।

পুনরাবৃত্তযোগ্য আর্গুমেন্টগুলি ক্রম বা কোনও পুনরাবৃত্ত বস্তু হতে পারে; ফলাফল সর্বদা একটি তালিকা।

কার্টেসিয়ান পণ্য তৈরিতে এই ভূমিকা কী করে?

content = map(tuple, array)

একটি কোথাও কোথাও একটি tuple স্থাপন কি প্রভাব আছে? আমি আরও লক্ষ্য করেছি যে মানচিত্রের ফাংশন ছাড়াই আউটপুটটি abcএবং এটির সাথে, এটি a, b, c

আমি এই ফাংশনটি পুরোপুরি বুঝতে চাই। রেফারেন্স সংজ্ঞাগুলি বোঝাও শক্ত। অনেক বেশি অভিনব ফ্লাফ


2
আপনি আসলে কী অর্জন করতে চান এবং কেন আপনি বিশেষভাবে ব্যবহার করতে চান map?
ক্রিস হার্পার

3
@ ওয়েবেমাস্টার হ্যাঁ, আপনি যে নথিটি আটকে দিয়েছেন তার প্রথম বাক্য অনুযায়ী - "পুনরাবৃত্তিযোগ্য প্রতিটি আইটেমের জন্য ফাংশন প্রয়োগ করুন"। অনুচ্ছেদটির বাকি অংশগুলি আরও জটিল ক্ষেত্রে - যেমনটি করতে map(None, a, b, c)দেখা যায় zip(a, b, c)। কিন্তু আপনি খুব কমই দেখতে পান যে বাস্তবে, স্পষ্টভাবে কারণ zipকলটি সমতুল্য।
lvc

9
আমি পাইথনটি শিখতে চেষ্টা করছি এবং যখনই পাইথন.আর.জে একটি সংজ্ঞা খুলি। প্রথম বাক্য পরে, আমি কিছুই বুঝতে পারি না। ঠিক আছে. ধন্যবাদ.
ওয়েব মাস্টার

2
tupleএটি একটি ফাংশন (ভাল, এটি এর চেয়ে বেশি সংখ্যক প্রয়োজন, তবে এটি একটি ফাংশনের মতো আচরণ করে) যা একটি পুনরাবৃত্ত হয় এবং আপনাকে একই উপাদানগুলির সাথে একটি টুপল দেয় - সুতরাং tuple([1, 2, 3])এটি সমান (1, 2, 3)। কারণ map(tuple, array), arrayপুনরাবৃত্তির পুনরাবৃত্ত হবে (তালিকার একটি তালিকা মনে করুন), এবং এটি আপনাকে প্রতিটি অভ্যন্তরের তালিকাটিকে একটি টিউপল হিসাবে ফিরিয়ে দেয়।
lvc

1
সাধারণভাবে, এটি সবচেয়ে গুরুত্বপূর্ণ যে কোনও ফাংশনের ডকুমেন্টেশনের প্রথম বাক্য। যদি আপনি এটি বুঝতে পারেন, আপনি এটির सारটি পান। এটা বাকি মহান বিষদভাবে আচরণ নির্দিষ্ট করে, এবং যে কিছু হবে একটি বিট অস্বচ্ছ দিয়ে শুরু হতে, এবং আপনি একটি বিজোড় বাগ্ধারা এটা উপর ভিত্তি করে আগে আপনি দেখতে জুড়ে আসা করার প্রয়োজন হতে পারে "উহু, যে মানে কি!"। তবে একবার আপনি কয়েকটি বিল্টিনের জন্য সেই লাইটব্লব মুহুর্তটি পেয়ে গেলে আপনার ডক্সটি আরও সহজে বোঝা শুরু করা উচিত।
lvc

উত্তর:


441

mapবিশেষত অজগর নয়। আমি পরিবর্তে তালিকা বোধগম্য ব্যবহার সুপারিশ করব:

map(f, iterable)

মূলত এর সমতুল্য:

[f(x) for x in iterable]

mapনিজে থেকে কার্টেসিয়ান পণ্য করতে পারে না কারণ এর আউটপুট তালিকার দৈর্ঘ্য সর্বদা এর ইনপুট তালিকার সমান হয়। আপনি একটি তালিকা বোঝার সাথে তুচ্ছভাবে কার্টেসিয়ান পণ্য করতে পারেন:

[(a, b) for a in iterable_a for b in iterable_b]

বাক্যবিন্যাসটি কিছুটা বিভ্রান্তিকর - এটি মূলত:

result = []
for a in iterable_a:
    for b in iterable_b:
        result.append((a, b))

36
আমি mapতালিকা বোধগমণের চেয়ে কম কম ভার্বোস ব্যবহার করে দেখতে পাই , কমপক্ষে আপনি যে ক্ষেত্রে প্রদর্শন করছেন for
মার্বেল

1
আমি কীভাবে বৈশিষ্ট্যগুলির জন্য মানচিত্র ব্যবহার করব? এর mapঅগ্রণী কী [v.__name__ for v in (object, str)]?
এ Sz

@ এজেড কেমন আছেন map(lambda v: v.__name__, list)?
কিলিয়ান

10
মানচিত্রটি দ্রুততর হয়েছে কারণ এটি
পুনরাবৃত্তির

1
@anati আমি ভেবেছিলাম mapছিল কখনও কখনও comprehensions তুলনায় দ্রুততর, অবিকল ফাংশন কল ওভারহেড কারণে কখনও কখনও না? বিশেষত, আমি যে তাত্ত্বিক শিখেছি তা হ'ল ব্যবহার mapকরার সময় আপনাকে অতিরিক্ত ফাংশন কল প্রবর্তন করার প্রয়োজন হয়, বোঝাপড়াগুলি দ্রুত হয়? যেমন আমি বিশ্বাস করি যে নেতৃত্বে ছিল map(lambda foo: foo.bar, my_list)তুলনায় ধীর হয় foo.bar for foo in my_list, এবং যে এমনকি map(operator.add, my_list_of_pairs)তুলনায় ধীর হয় x + y for x, y in my_list_of_pairsঅবিকল অতিরিক্ত ফাংশন কলের কারণে।
mtraceur

86

map কার্টেসিয়ান পণ্যের সাথে মোটেই সম্পর্কিত নয়, যদিও আমি কল্পনা করি যে কার্যকরী প্রোগ্রামিংয়ে পারদর্শী কেউ ব্যবহার করে কোনও জেনারেশন বোঝার মতো কিছু অসম্ভব নিয়ে আসতে পারেন map

map পাইথন 3 এ সমান:

def map(func, iterable):
    for i in iterable:
        yield func(i)

এবং পাইথন 2-এ একমাত্র পার্থক্য হ'ল এটি ফলাফলের সম্পূর্ণ তালিকা তৈরি করবে যা yieldআইংয়ের পরিবর্তে একবারে একবারে ফিরতে পারে ।

যদিও পাইথন কনভেনশন সাধারণত কল হিসাবে একই ফলাফল অর্জনের জন্য তালিকা বোঝার (বা জেনারেটর এক্সপ্রেশন) পছন্দ করে map, বিশেষত যদি আপনি প্রথম যুক্তি হিসাবে ল্যাম্বডা এক্সপ্রেশন ব্যবহার করেন:

[func(i) for i in iterable]

এই প্রশ্নের মন্তব্যে আপনি যা চেয়েছিলেন তার উদাহরণ হিসাবে - "অ্যারেতে একটি স্ট্রিং রূপান্তর করুন", 'অ্যারে' দ্বারা আপনি সম্ভবত একটি টুপল বা একটি তালিকা চান (উভয়ই অন্য ভাষা থেকে কিছুটা অ্যারের মতো আচরণ করে) -

 >>> a = "hello, world"
 >>> list(a)
['h', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd']
>>> tuple(a)
('h', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd')

mapআপনি যদি একক স্ট্রিংয়ের পরিবর্তে স্ট্রিংয়ের একটি তালিকা দিয়ে শুরু করেন - তবে mapতাদের সমস্তকে স্বতন্ত্রভাবে অনুকূল করতে পারেন: এখানে একটি ব্যবহার হবে would

>>> a = ["foo", "bar", "baz"]
>>> list(map(list, a))
[['f', 'o', 'o'], ['b', 'a', 'r'], ['b', 'a', 'z']]

দ্রষ্টব্য এটি map(list, a)পাইথন 2 এর সমতুল্য, তবে পাইথন 3 এ আপনি listযদি forলুপে খাওয়ানো (বা প্রসেসিং ফাংশন যেমন sumকেবল পুনরাবৃত্তীয় প্রয়োজন, এবং ক্রম নয়) প্রয়োজন হয় তবে আপনার কল প্রয়োজন । তবে আবার নোট করুন যে একটি তালিকা বোধগম্যতা সাধারণত পছন্দ করা হয়:

>>> [list(b) for b in a]
[['f', 'o', 'o'], ['b', 'a', 'r'], ['b', 'a', 'z']]

মানচিত্র (মজাদার এক্স -> (এক্স, এক্স)) বোঝা শক্ত মনে হচ্ছে না ... (যদিও মানচিত্রের থেকে সত্যিকারের কার্তেসিয়ান পণ্য পাওয়া অসম্ভব হবে, যে কোনও মানচিত্র যা তৈরি করে তা সর্বদা একটি তালিকার কিছু রূপ)
ক্রিস্টোফার মিকিনস্কি

36

map উত্সের প্রতিটি উপাদানগুলিতে একটি ফাংশন প্রয়োগ করে একটি নতুন তালিকা তৈরি করে:

xs = [1, 2, 3]

# all of those are equivalent — the output is [2, 4, 6]
# 1. map
ys = map(lambda x: x * 2, xs)
# 2. list comprehension
ys = [x * 2 for x in xs]
# 3. explicit loop
ys = []
for x in xs:
    ys.append(x * 2)

n-ary mapইনপুট পুনরাবৃত্তিগুলি একসাথে জিপ করা এবং তারপরে সেই মধ্যবর্তী জিপড তালিকার প্রতিটি উপাদানগুলিতে রূপান্তর ফাংশন প্রয়োগ করার সমতুল্য। এটা না একটি কার্টিজিয়ান পণ্য:

xs = [1, 2, 3]
ys = [2, 4, 6]

def f(x, y):
    return (x * 2, y // 2)

# output: [(2, 1), (4, 2), (6, 3)]
# 1. map
zs = map(f, xs, ys)
# 2. list comp
zs = [f(x, y) for x, y in zip(xs, ys)]
# 3. explicit loop
zs = []
for x, y in zip(xs, ys):
    zs.append(f(x, y))

আমি ব্যবহার করেছি zip এখানে , তবে mapপুনরাবৃত্তি একই আকারের না হলে আচরণটি কিছুটা পৃথক হয় - যেমনটি এর ডকুমেন্টেশনে উল্লিখিত রয়েছে, এটি পুনরাবৃত্তিকে ধারণ করতে প্রসারিত করে None


1
জটিল, এই পোস্টটি হজম করার চেষ্টা করছে
ওয়েব মাস্টার

1
@ ওয়েবমাস্টার এটি সম্পর্কে কী জটিল?
জেসি ক্যালডারন

আমার মতে সেরা উত্তর। উদাহরণস্বরূপ ল্যাম্বডাকে একটি ফাংশন হিসাবে ব্যবহার করা এটি খুব স্পষ্ট করে তোলে।
শেলডনজি

দুর্ভাগ্যক্রমে এগুলি সমস্ত সমতুল্য নয় - আউটপুটটি [2,4,6]তালিকা বোধগম্যতা এবং স্পষ্ট লুপগুলির জন্য, তবে মানচিত্রটি একটি মানচিত্রের প্রত্যাবর্তন করে - উদাহরণস্বরূপ আমি এটি পেয়েছি: <map at 0x123a49978>যা আমাকে অবশ্যই বাধ্যতামূলকভাবে একটি তালিকার মধ্যে তৈরি করতে হবে।
leerssej

20

কিছুটা সরল করে আপনি map()এই জাতীয় কিছু করার কল্পনা করতে পারেন :

def mymap(func, lst):
    result = []
    for e in lst:
        result.append(func(e))
    return result

আপনি দেখতে পাচ্ছেন, এটি একটি ফাংশন এবং একটি তালিকা নেয় এবং ইনপুট তালিকার প্রতিটি উপাদানগুলিতে ফাংশন প্রয়োগের ফলাফলের সাথে একটি নতুন তালিকা দেয়। আমি বলেছিলাম "কিছুটা সরলকরণ " কারণ বাস্তবে একাধিক পুনরাবৃত্ত map()প্রক্রিয়া করতে পারে :

যদি অতিরিক্ত পুনরাবৃত্ত যুক্তিগুলি পাস করা হয় তবে ফাংশনটিতে অবশ্যই অনেকগুলি আর্গুমেন্ট গ্রহণ করা উচিত এবং সমান্তরালে সমস্ত পুনরাবৃত্ত থেকে আইটেমগুলিতে প্রয়োগ করা হবে। যদি একটি পুনরাবৃত্তযোগ্য অন্যটির চেয়ে কম হয় তবে এটি কোনও আইটেমের সাথে বাড়ানো হবে বলে ধরে নেওয়া হয়।

প্রশ্নের দ্বিতীয় অংশের জন্য: কার্টেসিয়ান পণ্য তৈরিতে এই ভূমিকা কী করে? ভাল, এই জাতীয় তালিকার কার্টেসিয়ান পণ্য উত্পন্ন করার জন্য ব্যবহার করা map() যেতে পারে:

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

from operator import add
reduce(add, map(lambda i: map(lambda j: (i, j), lst), lst))

... তবে সত্য বলতে, product()সমস্যা সমাধানের জন্য ব্যবহার করা হ'ল সহজ এবং প্রাকৃতিক উপায়:

from itertools import product
list(product(lst, lst))

যে কোনও উপায়ে, ফলাফলটি lstউপরে বর্ণিত হিসাবে কার্টেসিয়ান পণ্য :

[(1, 1), (1, 2), (1, 3), (1, 4), (1, 5),
 (2, 1), (2, 2), (2, 3), (2, 4), (2, 5),
 (3, 1), (3, 2), (3, 3), (3, 4), (3, 5),
 (4, 1), (4, 2), (4, 3), (4, 4), (4, 5),
 (5, 1), (5, 2), (5, 3), (5, 4), (5, 5)]

17

দ্য map()ফাংশন একই পদ্ধতি তালিকা, জেনারেটর স্ট্রিং, এবং অন্যান্য উপাদান মত, একটি iterable ডাটা স্ট্রাকচার প্রতিটি আইটেমে প্রয়োগ করতে হয়।

আসুন একটি উদাহরণ তাকান: map() তালিকার প্রতিটি আইটেমটি পুনরাবৃত্তি করতে পারে এবং নতুন তালিকার পরিবর্তে (আপনাকে ফিরিয়ে দেয়) তার চেয়ে প্রতিটি আইটেমটিতে একটি ফাংশন প্রয়োগ করতে পারে।

কল্পনা করুন যে আপনার একটি ফাংশন রয়েছে যা একটি সংখ্যা নেয়, সেই সংখ্যায় 1 যোগ করে এবং তা ফেরত দেয়:

def add_one(num):
  new_num = num + 1
  return new_num

আপনার কাছে সংখ্যার একটি তালিকাও রয়েছে:

my_list = [1, 3, 6, 7, 8, 10]

আপনি যদি তালিকার প্রতিটি সংখ্যা বৃদ্ধি করতে চান তবে আপনি নিম্নলিখিতটি করতে পারেন:

>>> map(add_one, my_list)
[2, 4, 7, 8, 9, 11]

দ্রষ্টব্য: সর্বনিম্ন map() দুটি আর্গুমেন্ট দরকার। প্রথমে একটি ফাংশনের নাম এবং দ্বিতীয় কোনও তালিকার মতো।

আসুন দেখে নেওয়া যাক আরও কিছু দুর্দান্ত জিনিসগুলি map()করতে পারে। map()একাধিক পুনরাবৃত্ত (তালিকাগুলি, স্ট্রিং ইত্যাদি) নিতে পারে এবং প্রতিটি পুনরাবৃত্ত থেকে একটি উপাদান আর্গুমেন্ট হিসাবে একটি ফাংশনে পাস করতে পারে।

আমাদের তিনটি তালিকা রয়েছে:

list_one = [1, 2, 3, 4, 5]
list_two = [11, 12, 13, 14, 15]
list_three = [21, 22, 23, 24, 25]

map() আপনাকে একটি নতুন তালিকা তৈরি করতে পারে যা একটি নির্দিষ্ট সূচীতে উপাদানগুলির সংযোজনকে ধারণ করে।

এখন মনে রাখবেন map(), একটি ফাংশন প্রয়োজন। এবার আমরা বিল্টিন sum()ফাংশনটি ব্যবহার করব । চলমান map()নিম্নলিখিত ফলাফল দেয়:

>>> map(sum, list_one, list_two, list_three)
[33, 36, 39, 42, 45]

স্মরণ করুন:
পাইথন ২-এ map(), দীর্ঘতম তালিকা অনুসারে পুনরাবৃত্তি হবে (তালিকার উপাদানগুলির মধ্য দিয়ে যান) এবং Noneসংক্ষিপ্ত তালিকার জন্য ফাংশনে যাবে, সুতরাং আপনার ফাংশনটি সন্ধান করা Noneএবং পরিচালনা করা উচিত , অন্যথায় আপনি ত্রুটি পাবেন। পাইথনে 3 map()সংক্ষিপ্ত তালিকাটি শেষ করে থামবে। এছাড়াও, পাইথন 3 এ, map()কোনও পুনরুক্তি প্রদান করে, তালিকা নয়।


8

পাইথন 3 - মানচিত্র (চমত্কার, পুনরাবৃত্ত)

একটি জিনিস যা সম্পূর্ণরূপে উল্লিখিত হয়নি (যদিও @ ব্লুব কিন্ডা এটি উল্লেখ করেছেন) তা হ'ল মানচিত্রটি কোনও মানচিত্রের অবজেক্টকে একটি তালিকা নয় returns এটি যখন আরম্ভ এবং পুনরাবৃত্তির সময় পারফরম্যান্সের ক্ষেত্রে আসে তখন এটি একটি বড় পার্থক্য। এই দুটি পরীক্ষা বিবেচনা করুন।

import time
def test1(iterable):
    a = time.clock()
    map(str, iterable)
    a = time.clock() - a

    b = time.clock()
    [ str(x) for x in iterable ]
    b = time.clock() - b

    print(a,b)


def test2(iterable):
    a = time.clock()
    [ x for x in map(str, iterable)]
    a = time.clock() - a

    b = time.clock()
    [ str(x) for x in iterable ]
    b = time.clock() - b

    print(a,b)


test1(range(2000000))  # Prints ~1.7e-5s   ~8s
test2(range(2000000))  # Prints ~9s        ~8s

আপনি দেখতে পাচ্ছেন মানচিত্রের ক্রিয়াকলাপটি মোটেও কোনও সময় নেয় না। তবে মানচিত্রের অবজেক্টের মাধ্যমে পুনরাবৃত্তি কেবল পুনরাবৃত্তীয়গুলির মাধ্যমে পুনরাবৃত্ত হওয়ার চেয়ে বেশি সময় নেয়। এর অর্থ হ'ল মানচিত্রে ফাংশনটি পাস (প্রতিটি) পুনরুক্তিতে উপাদান পৌঁছানো পর্যন্ত প্রতিটি উপাদানকে প্রয়োগ করা হয় না। আপনি যদি চান একটি তালিকা ব্যবহার তালিকা বোধগম্য। যদি আপনি একটি লুপের মাধ্যমে পুনরাবৃত্তি করার পরিকল্পনা করেন এবং কোনও সময়ে ভেঙে যান তবে মানচিত্রটি ব্যবহার করুন।

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