tl; ডা
একটি জেনারেটর এক্সপ্রেশন সম্ভবত আপনার সমস্যার সর্বাধিক পারফরম্যান্ট এবং সহজ সমাধান:
l = [(1,"juca"),(22,"james"),(53,"xuxa"),(44,"delicia")]
result = next((i for i, v in enumerate(l) if v[0] == 53), None)
ব্যাখ্যা
বেশ কয়েকটি উত্তর রয়েছে যা তালিকার বোধগম্যতার সাথে এই প্রশ্নের সহজ সমাধান সরবরাহ করে। যদিও এই উত্তরগুলি পুরোপুরি সঠিক, সেগুলি অনুকূল নয়। আপনার ব্যবহারের ক্ষেত্রে উপর নির্ভর করে কয়েকটি সাধারণ পরিবর্তন করে গুরুত্বপূর্ণ সুবিধা পেতে পারে।
এই ব্যবহারের ক্ষেত্রে তালিকার বোঝাপড়াটি ব্যবহার করে আমি যে প্রধান সমস্যাটি দেখছি তা হ'ল সম্পূর্ণ তালিকাটি প্রক্রিয়া করা হবে, যদিও আপনি কেবল 1 টি উপাদান খুঁজে পেতে চান ।
পাইথন একটি সাধারণ কনস্ট্রাক্ট সরবরাহ করে যা এখানে আদর্শ। একে জেনারেটর এক্সপ্রেশন বলে । এখানে একটি উদাহরণ:
l = [(1,"juca"),(22,"james"),(53,"xuxa"),(44,"delicia")]
next((i for i, v in enumerate(l) if v[0] == 53), None)
আমরা এই পদ্ধতিটি তুচ্ছ উদাহরণের সাথে তালিকান বোধগম্যগুলির মতো একইভাবে সম্পাদন করতে পারি বলে আশা করতে পারি, তবে আমরা যদি আরও বড় ডেটা সেট নিয়ে কাজ করছি? জেনারেটর পদ্ধতি ব্যবহারের সুবিধাটি এখানে কার্যকর হয়। নতুন তালিকা তৈরির পরিবর্তে আমরা আপনার বিদ্যমান তালিকাটি আমাদের পুনরাবৃত্ত হিসাবে ব্যবহার করব এবং next()
আমাদের জেনারেটর থেকে প্রথম আইটেমটি ব্যবহার করতে ব্যবহার করব ।
কিছু বড় ডেটা সেটগুলিতে এই পদ্ধতিগুলি কীভাবে আলাদাভাবে সম্পাদন করে তা দেখুন look শুরুতে (সেরা) বা শেষ (খারাপ) আমাদের টার্গেট সহ এগুলি 10000000 + 1 উপাদানগুলির তৈরি বড় তালিকা। আমরা যাচাই করতে পারি যে এই দুটি তালিকা নীচের তালিকার বোধগম্যতা ব্যবহার করে সমানভাবে সম্পাদন করবে:
বোধগম্য তালিকা
"নিকৃষ্ট ঘটনা"
worst_case = ([(False, 'F')] * 10000000) + [(True, 'T')]
print [i for i, v in enumerate(worst_case) if v[0] is True]
"সর্বোত্তম ঘটনা"
best_case = [(True, 'T')] + ([(False, 'F')] * 10000000)
print [i for i, v in enumerate(best_case) if v[0] is True]
জেনারেটর এক্সপ্রেশন
এখানে জেনারেটরগুলির জন্য আমার অনুমানটি রয়েছে: আমরা দেখতে পাব যে জেনারেটরগুলি সর্বোত্তম ক্ষেত্রে ভালভাবে পারফর্ম করতে পারে তবে একইভাবে সবচেয়ে খারাপ ক্ষেত্রে। এই পারফরম্যান্স লাভটি বেশিরভাগ কারণে জেনারেটরকে অলসভাবে মূল্যায়ন করা হয় এর কারণেই হয়, যার অর্থ এটি কেবল মূল্য নির্ধারণের জন্য যা প্রয়োজন তা গণনা করবে।
নিকৃষ্ট ঘটনা
সর্বোত্তম ঘটনা
best_case = [(True, 'T')] + ([(False, 'F')] * 10000000)
print next((i for i, v in enumerate(best_case) if v[0] == True), None)
কি?! সেরা ক্ষেত্রে তালিকার বোধগম্যতা দূরে সরিয়ে দেয়, তবে আমি আমাদের খারাপ পরিস্থিতিটি তালিকা বোধগম্যতা এতটা ছাড়িয়ে যাওয়ার আশা করছিলাম না। ওটা কেমন? সত্যি বলতে কী, আমি কেবল আরও গবেষণা ছাড়াই অনুমান করতে পারি।
এই সমস্ত লবণের এক দানা দিয়ে নিন, আমি এখানে কোনও মজবুত প্রোফাইলিং চালাইনি, কেবলমাত্র কয়েকটি খুব প্রাথমিক পরীক্ষা। এই ধরণের তালিকা অনুসন্ধানের জন্য একটি জেনারেটর এক্সপ্রেশন আরও পারফরম্যান্ট তা উপলব্ধি করার জন্য এটি পর্যাপ্ত হওয়া উচিত।
দ্রষ্টব্য যে এটি সমস্ত মৌলিক, অন্তর্নির্মিত পাইথন। আমাদের কিছু আমদানি বা কোনও লাইব্রেরি ব্যবহার করার দরকার নেই।
আমি পিটার নরভিগের সাথে উদাসিটি সিএস 1212 কোর্সে অনুসন্ধান করার জন্য এই কৌশলটি প্রথম দেখলাম ।