অনেকগুলি ব্যবহারের ক্ষেত্রে, আপনি যে উত্তরটি চান তা হ'ল:
ys = set(y)
[item for item in x if item not in ys]
এটি অ্যারোনস্টার্লিংয়ের উত্তর এবং কোয়ান্টামসুপের উত্তরগুলির মধ্যে একটি সংকর ।
অ্যারোনস্টার্লিংয়ের সংস্করণ len(y)
প্রতিটি উপাদানের সাথে আইটেমের তুলনা করে x
, তাই এটি চতুর্ভুজ সময় নেয়। quantumSoup এর সংস্করণ ব্যবহার সেট, তাই এটি প্রতিটি উপাদান জন্য একটি একক ধ্রুবক-টাইম সেট লুকআপ না x
-কিন্তু, কারণ এটি পরিবর্তন করে উভয় x
এবং y
সেটে, এটা আপনার উপাদানের ক্রম হারায়।
কেবলমাত্র y
একটি সেটে রূপান্তর করে x
এবং ক্রমে পুনরাবৃত্তি করার মাধ্যমে আপনি উভয় বিশ্বের সেরা — রৈখিক সময় এবং অর্ডার সংরক্ষণ পান *
তবে এটি এখনও কোয়ান্টামসুপের সংস্করণ থেকে একটি সমস্যা রয়েছে: এটির জন্য আপনার উপাদানগুলি হ্যাশযোগ্য হওয়া দরকার। এটি সেটগুলির প্রকৃতিতে নির্মিত হয়েছে *
আপনি যদি নিজের মানগুলি কোনওভাবে সাজাতে পারেন তবে এটি সমস্যার সমাধান করে dec উদাহরণস্বরূপ, একটি সমতল অভিধানের সাথে যার মানগুলি নিজেরাই হাশেবল:
ys = {tuple(item.items()) for item in y}
[item for item in x if tuple(item.items()) not in ys]
যদি আপনার প্রকারগুলি কিছুটা আরও জটিল হয় (উদাহরণস্বরূপ, আপনি প্রায়শই JSON- সামঞ্জস্যপূর্ণ মানগুলির সাথে লেনদেন করেন যা হ্যাশযোগ্য, বা তালিকা বা dicts যার মানগুলি পুনরাবৃত্তভাবে একই ধরণের হয়) তবে আপনি এখনও এই সমাধানটি ব্যবহার করতে পারেন। তবে কিছু প্রকার কেবল হ্যাশযোগ্য কিছুতে রূপান্তর করা যায় না।
যদি আপনার আইটেমগুলি না তৈরি হয় এবং এটি তৈরি করা যায় না, তড়িঘড়ি করতে সক্ষম হয় তবে সেগুলি তুলনামূলক হয় তবে আপনি কমপক্ষে লগ-লিনিয়ার সময় পেতে পারেন ( O(N*log M)
যা O(N*M)
তালিকার সমাধানের সময়ের চেয়ে অনেক ভাল , তবে যতটা ভাল না O(N+M)
সেট সমাধানের সময়) বাছাই এবং ব্যবহার করে bisect
:
ys = sorted(y)
def bisect_contains(seq, item):
index = bisect.bisect(seq, item)
return index < len(seq) and seq[index] == item
[item for item in x if bisect_contains(ys, item)]
যদি আপনার আইটেমগুলি নাও ধাবনযোগ্য বা তুলনীয় হয় না, তবে আপনি চতুর্ভুজ সমাধানের সাথে আটকে আছেন।
* নোট করুন যে আপনি একজোড়া OrderedSet
অবজেক্ট ব্যবহার করে এটিও করতে পারেন, যার জন্য আপনি রেসিপি এবং তৃতীয় পক্ষের মডিউলগুলি খুঁজে পেতে পারেন। তবে আমি মনে করি এটি সহজ।
** কারণ নির্ধারণের জন্য ধ্রুবক সময় হ'ল এটির যা করতে হবে তা হ্যাশ হ'ল এবং দেখুন যে হ্যাশের জন্য কোনও প্রবেশ আছে কিনা। যদি এটি মানটি হ্যাশ করতে না পারে তবে এটি কাজ করবে না।