পাইথন ৩.x এ একটি তালিকা ফেরত পেতে একটি মানচিত্র () পাওয়া


523

আমি একটি তালিকা হেক্সে ম্যাপ করার চেষ্টা করছি এবং তারপরে অন্য কোথাও তালিকাটি ব্যবহার করব। অজগর ২.6-এ, এটি সহজ ছিল:

উত্তর: পাইথন ২.6:

>>> map(chr, [66, 53, 0, 94])
['B', '5', '\x00', '^']

তবে পাইথন ৩.১-তে উপরোক্ত কোনও মানচিত্রের অবজেক্ট প্রদান করে।

বি: পাইথন ৩.১:

>>> map(chr, [66, 53, 0, 94])
<map object at 0x00AF5570>

পাইথন ৩.x আমি কীভাবে ম্যাপ করা তালিকাটি ( উপরে একটি হিসাবে আছে ) পুনরুদ্ধার করব ?

বিকল্পভাবে, এটি করার আরও ভাল উপায় আছে? আমার প্রাথমিক তালিকার অবজেক্টটিতে প্রায় 45 টি আইটেম রয়েছে এবং আইডি সেগুলি হেক্সে রূপান্তর করতে পছন্দ করে।


2
একটি তালিকা বোধগম্যতা ব্যবহার করা আরও অজগর । ভাষা থেকে প্রায় সরানোmap() হয়েছিল কারণ এটি কোনও তালিকা বোঝার বা লুপের মাধ্যমে ব্যবহার করার কোনও কারণ নেই । for
বরিস

উত্তর:


771

এটা কর:

list(map(chr,[66,53,0,94]))

পাইথন 3+ এ, অনেকগুলি প্রক্রিয়া যা পুনরাবৃত্তিযোগ্যগুলি দিয়ে পুনরাবৃত্তি হয় তারা নিজেই পুনরাবৃত্তি করে। বেশিরভাগ ক্ষেত্রে, এটি মেমরির সঞ্চয় করে শেষ করে এবং জিনিসগুলিকে দ্রুত এগিয়ে নেওয়া উচিত।

আপনি যা করতে যাচ্ছেন সবগুলি যদি শেষ পর্যন্ত এই তালিকার উপরে পুনরাবৃত্তি হয় তবে এটিকে একটি তালিকায় রূপান্তর করারও দরকার নেই, কারণ আপনি এখনও mapঅবজেক্টের মতো পুনরাবৃত্তি করতে পারেন:

# Prints "ABCD"
for ch in map(chr,[65,66,67,68]):
    print(ch)

15
অবশ্যই, আপনি এটির উপরও পুনরাবৃত্তি করতে পারেন: (chr (x) x এর জন্য [65,66,67,68])। এমনকি এটি মানচিত্রের প্রয়োজন নেই।
হিউডব্রাউন

2
@ হাগডব্রাউন mapএকটি জটিল ফাংশন, বড় ডেটা সেট বা স্ট্রিমগুলিতে পুনরাবৃত্তি করার সময় 3.1 ব্যবহার করার যুক্তিটি অলস মূল্যায়ন হবে।
অ্যান্ড্রু কিটন

18
@ অ্যান্ড্রু প্রকৃতপক্ষে হিউ একটি জেনারেটর বোঝার উত্সাহ দিচ্ছেন যা একই কাজ করবে। বর্গক্ষেত্র বন্ধনীর পরিবর্তে প্রথম বন্ধনী নোট করুন।
ট্রিপটাইচ

5
বিকল্প সমাধান (বৃহত ইনপুটগুলির জন্যও দ্রুত) যখন মানগুলি ASCII / লাতিন -১ হিসাবে পরিচিত হয় তখন সি স্তরে বাল্ক রূপান্তর করা হয়: bytes(sequence_of_ints_in_range_0_to_256).decode('latin-1')যা strপাইথন ফাংশন এড়িয়ে দ্রুততর করে তোলে প্রতিটি উপাদানকে একটি বৃহত রূপান্তরের পক্ষে কল করে faster সমস্ত উপাদান কেবল সি লেভেল ফাংশন কল ব্যবহার করে। আপনার listযদি listআলাদা আলাদা চরিত্রের সত্যিকারের প্রয়োজন হয় তবে আপনি উপরের মোড়কে রাখতে পারেন , তবে যেহেতু strইতিমধ্যে এটি নিজস্ব চরিত্রগুলির একটি পুনরাবৃত্তিযোগ্য, কেবলমাত্র যদি আপনি পরিবর্তন করতে চান তবেই আপনি এটি করতে পারবেন।
শ্যাডোর্যাঞ্জার

1
তালিকা (মানচিত্র (টিআর, [1,2,3]) সেন্টোস 7 এ পাইথন ৩.৪.৩ এর জন্য "যুক্তিতে ত্রুটি" দেয় compre. বোঝার কাজগুলি তালিকাবদ্ধ করে।
Andor

108

পাইথন 3.5 তে নতুন এবং ঝরঝরে:

[*map(chr, [66, 53, 0, 94])]

অতিরিক্ত আনপ্যাকিং জেনারালাইজেশনকে ধন্যবাদ

হালনাগাদ

সর্বদা সংক্ষিপ্ত উপায়ে খোঁজা, আমি আবিষ্কার করেছি যে এটিও কাজ করে:

*map(chr, [66, 53, 0, 94]),

আনপ্যাকিং টিপলগুলিতেও কাজ করে। শেষে কমা নোট করুন। এটি এটিকে 1 টি উপাদানের টুপল করে তোলে। যে, এটি সমতুল্য(*map(chr, [66, 53, 0, 94]),)

তালিকা-বন্ধনীগুলির সাথে সংস্করণ থেকে এটি কেবলমাত্র একটি চর দ্বারা সংক্ষিপ্ত, তবে, আমার মতে, লিখতে ভাল, কারণ আপনি ডুবুরি - প্রসারণ সিনট্যাক্স দিয়ে ঠিক সামনে শুরু করেছেন, তাই আমি মনে করি এটি মৃদু নরম। :)


11
@ কিউলক্লেফ list()ঝরঝরে মত দেখাচ্ছে না
আরিজুন

5
@ কিউলক্লেফ: এছাড়াও, আনপ্যাকিং পদ্ধতিটি listনির্মাণকারীর সন্ধান করার প্রয়োজন নেই এবং সাধারণ ফাংশন কল যন্ত্রপাতিটি চালিত করার প্রয়োজন নেই বলে ক্ষুদ্রতর দ্রুত ধন্যবাদ জানায় । দীর্ঘ ইনপুট জন্য, এটি কোন ব্যাপার না; একটি সংক্ষিপ্ত জন্য, এটি একটি বড় পার্থক্য করতে পারে। উপরের কোডটি ইনপুটটির সাথে এটি ব্যবহার করে tupleযাতে এটি বারবার পুনর্গঠন করা হয় না, ipythonমাইক্রোব্যাঙ্কমার্কগুলি দেখায় যে list()মোড়ানোর পদ্ধতিটি আনপ্যাকিংয়ের চেয়ে প্রায় 20% বেশি সময় নেয়। মনে মনে, আমরা 150 এনএস সম্পর্কে কথা বলছি, যা তুচ্ছ, তবে আপনি ধারণা পাবেন।
শ্যাডোর্যাঞ্জার

পুরানো mapকি হয়েছে? নতুন কোনও lmapডিফল্ট যদি কোনও পুনরায় পাঠককে ফেরত দেয় তবে নতুন নাম ( ?) দিয়ে থাকতে পারে ?
জর্জিও

1
*map()উপর বাক্যগঠন ত্রুটি দেয় Python 3.6: can't use starred expression here। আপনার এটিতে রাখা দরকার list:[ *map() ]
ALH

4
@ ALH আপনি কমান্ডের শেষে কমাটি মিস করেছেন। করা সহজ ভুল!
লন্ডনরব

103

আপনি কেন এটি করছেন না:

[chr(x) for x in [66,53,0,94]]

এটিকে তালিকা অনুধাবন বলে। গুগলে আপনি প্রচুর তথ্য পেতে পারেন তবে তালিকার বোঝার জন্য পাইথনের (২.6) ডকুমেন্টেশনের লিঙ্কটি এখানে । যদিও পাইথন 3 ডকুমেন্টেশনগুলিতে আপনার আরও আগ্রহী হতে পারে ।


4
Hmmmm। সম্ভবত তালিকার বোধগম্যতা, জেনারেটর, মানচিত্র (), জিপ () এবং অজগরের অনেকগুলি দ্রুত পুনরাবৃত্তির ধার্মিকতা সম্পর্কে একটি সাধারণ পোস্টিং দরকার।
হিউডব্রাউন

46
আমি অনুমান করি কারণ এটি আরও ভার্বোজ, আপনাকে একটি অতিরিক্ত ভেরিয়েবল লিখতে হবে (দ্বিগুণ) ... যদি অপারেশনটি আরও জটিল হয় এবং আপনি ল্যাম্বদা লেখার কাজটি শেষ করেন, বা আপনার কিছু উপাদানও ফেলে দেওয়ার প্রয়োজন হয়, আমি মনে করি একটি বোঝাপড়া অবশ্যই আরও ভাল একটি মানচিত্র + ফিল্টারের চেয়ে আপনি যদি ইতিমধ্যে ফাংশনটি প্রয়োগ করতে চান তবে মানচিত্রটি আরও সংযোগযুক্ত।
ফোরট্রান

1
+1: পড়া সহজ এবং আপনাকে অনেকগুলি পরামিতিগুলির সাথে ফাংশনগুলি ব্যবহার করতে দেয়
লে ড্রয়েড

7
map(chr, [66,53,0,94])অবশ্যই তুলনায় আরও সংক্ষিপ্ত [chr(x) for x in [66,53,0,94]]
জর্জিও ২

অন্যান্য উত্তরের চেয়ে দ্রুত গতিতে
Evhz

25

তালিকা-ফেরত মানচিত্রের ফাংশনটিতে টাইপিং সংরক্ষণের সুবিধা রয়েছে, বিশেষত ইন্টারেক্টিভ সেশনের সময়। আপনি lmapফাংশনটি (পাইথন 2 এর উপমা অনুসারে imap) সংজ্ঞায়িত করতে পারেন যা প্রত্যাবর্তন তালিকা:

lmap = lambda func, *iterable: list(map(func, *iterable))

তার lmapপরিবর্তে কল করা mapকাজটি করবে: lmap(str, x)5 টি অক্ষর (এই ক্ষেত্রে 30%) এর চেয়ে কম list(map(str, x))এবং অবশ্যই এর চেয়ে কম হয় [str(v) for v in x]। আপনি filterখুব অনুরূপ ফাংশন তৈরি করতে পারেন ।

মূল প্রশ্নের একটি মন্তব্য ছিল:

পাইথন 3-তে একটি তালিকা ফেরত দেওয়ার জন্য আমি মানচিত্র () অর্জন করার জন্য একটি নতুন নাম প্রস্তাব করব * * এটি সমস্ত পাইথন 3 সংস্করণে প্রযোজ্য। এই কাজ করতে একটি উপায় আছে কি? - meawoppl 24 জানুয়ারী 17:58 এ

এটি করা সম্ভব, তবে এটি একটি খুব খারাপ ধারণা। কেবল মজাদার জন্য, আপনি কীভাবে এটি করতে পারেন ( তবে তা করা উচিত নয় ):

__global_map = map #keep reference to the original map
lmap = lambda func, *iterable: list(__global_map(func, *iterable)) # using "map" here will cause infinite recursion
map = lmap
x = [1, 2, 3]
map(str, x) #test
map = __global_map #restore the original map and don't do that again
map(str, x) #iterator

4

আরও ভাল দৃশ্যমানতার জন্য আমার পুরানো মন্তব্যে রূপান্তর করা : mapসম্পূর্ণরূপে ছাড়াই "এটি করার সর্বোত্তম উপায়ের " জন্য , যদি আপনার ইনপুটগুলি ASCII অধ্যাদেশ হিসাবে পরিচিত হয়, তবে এটি সাধারণত একটি লাতে রূপান্তর bytesএবং ডিকোড করা অনেক দ্রুত হয় bytes(list_of_ordinals).decode('ascii')। এটি আপনাকে একটি strমান দেয়, তবে যদি আপনার listপরিবর্তন বা এর মতো প্রয়োজন হয় তবে আপনি কেবল এটি রূপান্তর করতে পারেন (এবং এটি এখনও আরও দ্রুত)। উদাহরণস্বরূপ, ipythonমাইক্রোব্যাঙ্কমার্কগুলিতে 45 ​​ইনপুট রূপান্তর করা:

>>> %%timeit -r5 ordinals = list(range(45))
... list(map(chr, ordinals))
...
3.91 µs ± 60.2 ns per loop (mean ± std. dev. of 5 runs, 100000 loops each)

>>> %%timeit -r5 ordinals = list(range(45))
... [*map(chr, ordinals)]
...
3.84 µs ± 219 ns per loop (mean ± std. dev. of 5 runs, 100000 loops each)

>>> %%timeit -r5 ordinals = list(range(45))
... [*bytes(ordinals).decode('ascii')]
...
1.43 µs ± 49.7 ns per loop (mean ± std. dev. of 5 runs, 1000000 loops each)

>>> %%timeit -r5 ordinals = list(range(45))
... bytes(ordinals).decode('ascii')
...
781 ns ± 15.9 ns per loop (mean ± std. dev. of 5 runs, 1000000 loops each)

যদি আপনি এটি হিসাবে ছেড়ে যান strতবে দ্রুততম mapসমাধানগুলির জন্য ~ 20% সময় লাগে ; এমনকি এটি দ্রুততম mapসমাধানের 40% এরও কম কম তালিকায় ফিরে রূপান্তর করা । মাধ্যমে বাল্ক ধর্মান্তরিত bytesএবং bytes.decodeতারপর ফিরে রূপান্তর বাল্ক listকাজ অনেক সংরক্ষণ করে, কিন্তু যেমন উল্লেখ করা হয়েছে, শুধুমাত্র কাজ করে সব আপনার ইনপুট (প্রতি চরিত্র লোকেল নির্দিষ্ট এনকোডিং কেউ বাইট অথবা ordinals যেমন হওয়া ASCII ordinals হয় latin-1)।


2
list(map(chr, [66, 53, 0, 94]))

মানচিত্র (ফানক, * পুনরাবৃত্ত) -> মানচিত্র অবজেক্ট এমন একটি পুনরুক্তি তৈরি করুন যা পুনরাবৃত্তের প্রতিটি থেকে আর্গুমেন্ট ব্যবহার করে ফাংশনটি গণনা করে। সংক্ষিপ্ততম পুনরাবৃত্তির অবসান হলে থামে।

"একটি পুনরুক্তি তৈরি করুন"

এর অর্থ এটি একটি পুনরাবৃত্তিকে ফিরিয়ে দেবে।

"যা পুনরাবৃত্তিগুলির প্রতিটি থেকে যুক্তি ব্যবহার করে ফাংশনটি গণনা করে"

এর অর্থ হল যে পুনরাবৃত্তির পরবর্তী () ফাংশনটি প্রতিটি পুনরাবৃত্তের একটি করে মূল্য নেবে এবং সেগুলির প্রতিটি ফাংশনের একটি অবস্থানীয় প্যারামিটারে স্থান দেবে।

সুতরাং আপনি মানচিত্র () ফান্ট থেকে একটি পুনরাবৃত্তি পান এবং এটি তালিকাতে () অন্তর্নির্মিত ফাংশনটিতে বা পাসের তালিকাটি বোঝার জন্য পাস করুন pass


2

উপরের উত্তরগুলি ছাড়াও Python 3, আমরা কেবল listএকটি mapas থেকে ফলাফলের মানগুলি তৈরি করতে পারি

li = []
for x in map(chr,[66,53,0,94]):
    li.append(x)

print (li)
>>>['B', '5', '\x00', '^']

আমি অন্য একটি উদাহরণ দিয়ে সাধারণীকরণ করতে পারি যেখানে আমাকে আঘাত করা হয়েছিল, মানচিত্রের ক্রিয়াকলাপগুলি regexসমস্যার মতো একই পদ্ধতিতে পরিচালনা করা যেতে পারে , আমরা listমানচিত্রে আইটেমগুলি অর্জন করতে একই সাথে ফাংশন লিখতে পারি এবং ফলাফল একই সাথে সেট করতে পারি। যাত্রা।

b = 'Strings: 1,072, Another String: 474 '
li = []
for x in map(int,map(int, re.findall('\d+', b))):
    li.append(x)

print (li)
>>>[1, 72, 474]

@ এমিরাদুলো আমি পাইথন 2-তে অনুমান করেছি, একটি তালিকা ফিরে এসেছে, তবে পাইথন 3-তে কেবল টাইপই ফিরে আসে এবং আমি ঠিক একই ফর্ম্যাটে দেওয়ার চেষ্টা করেছি। যদি আপনি এটি অপ্রয়োজনীয় মনে করেন, তবে আমার মতো লোকেরা সম্ভবত এটির দরকারী খুঁজে পেতে পারে এবং আমি কেন যুক্ত করেছি তা জানতে পারে।
হ্যারি_পিবি

2
যখন ইতিমধ্যে একটি তালিকা উপলব্ধি, একটি তালিকা ফাংশন এবং একটি আনপ্যাকিং উত্তর রয়েছে তখন লুপের জন্য একটি স্পষ্টত অনেক আইএমএইচও যোগ করে না।
মিরাদুলো

1

আপনি অবজেক্টের প্রতিটি আইটেমটি কেবল পুনরাবৃত্তি করে মানচিত্র অবজেক্ট থেকে একটি তালিকা পাওয়ার চেষ্টা করতে পারেন এবং এটি একটি ভিন্ন ভেরিয়েবলে সঞ্চয় করতে পারেন।

a = map(chr, [66, 53, 0, 94])
b = [item for item in a]
print(b)
>>>['B', '5', '\x00', '^']

0

পাইথন এবং বুনিয়াদি মানচিত্রের কার্যকারিতা ইউটিলিটিতে তালিকার বোঝাপড়া ব্যবহার করে, কেউ এটিও করতে পারেন:

chi = [x for x in map(chr,[66,53,0,94])]


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