এই বিভাগটি বর্ণনা করে কিভাবে একটি তালিকা (অ্যারে) থেকে সদৃশ উপাদানগুলি সরিয়ে বা বের করে পাইথনে একটি নতুন তালিকা তৈরি করা যায়।
নিম্নলিখিত বিবরণ এখানে বর্ণনা করা হয়.
- সদৃশ উপাদানগুলি সরান এবং নতুন তালিকা তৈরি করুন
- মূল তালিকার ক্রম সংরক্ষণ করবেন না:
set()
- মূল তালিকার ক্রম সংরক্ষণ করে:
dict.fromkeys()
,sorted()
- দ্বি-মাত্রিক অ্যারে (তালিকার তালিকা)
- মূল তালিকার ক্রম সংরক্ষণ করবেন না:
- সদৃশ উপাদানগুলি বের করুন এবং একটি নতুন তালিকা তৈরি করুন
- মূল তালিকার ক্রম সংরক্ষণ করবেন না
- মূল তালিকার ক্রম সংরক্ষণ করে
- দ্বি-মাত্রিক অ্যারে (তালিকার তালিকা)
একই ধারণা তালিকার পরিবর্তে টিপলে প্রয়োগ করা যেতে পারে।
জন্য নিম্নলিখিত নিবন্ধ দেখুন
- আপনি যদি একটি তালিকা বা tuple সদৃশ উপাদান আছে কিনা তা নির্ধারণ করতে চান
- আপনি যদি একক তালিকার পরিবর্তে একাধিক তালিকার মধ্যে সাধারণ বা সাধারণ নয় এমন উপাদানগুলি বের করতে চান
মনে রাখবেন যে তালিকাগুলি বিভিন্ন ধরণের ডেটা সঞ্চয় করতে পারে এবং অ্যারে থেকে কঠোরভাবে আলাদা। আপনি যদি মেমরির আকার এবং মেমরির ঠিকানা বা বড় ডেটার সংখ্যাগত প্রক্রিয়াকরণের প্রয়োজন হয় এমন প্রক্রিয়াগুলিতে অ্যারেগুলি পরিচালনা করতে চান তবে অ্যারে (স্ট্যান্ডার্ড লাইব্রেরি) বা NumPy ব্যবহার করুন।
সদৃশ উপাদানগুলি সরান এবং নতুন তালিকা তৈরি করুন
মূল তালিকার ক্রম সংরক্ষণ করবেন না:set()
যদি মূল তালিকার ক্রম সংরক্ষণ করার প্রয়োজন না থাকে, তাহলে set() ব্যবহার করুন, যা একটি সেট টাইপ সেট তৈরি করে।
সেট টাইপ হল একটি ডাটা টাইপ যার কোন ডুপ্লিকেট উপাদান নেই। যখন একটি তালিকা বা অন্যান্য ডেটা টাইপ সেট() এ পাস করা হয়, তখন ডুপ্লিকেট মান উপেক্ষা করা হয় এবং টাইপ সেটের একটি বস্তু ফেরত দেওয়া হয় যেখানে শুধুমাত্র অনন্য মানগুলি উপাদান।
আপনি এটি একটি tuple করতে চান, tuple() ব্যবহার করুন.
l = [3, 3, 2, 1, 5, 1, 4, 2, 3]
print(set(l))
# {1, 2, 3, 4, 5}
print(list(set(l)))
# [1, 2, 3, 4, 5]
অবশ্যই, এটি সেট হিসাবেও ছেড়ে দেওয়া যেতে পারে। সেট টাইপ সেট সম্পর্কে আরও তথ্যের জন্য নিম্নলিখিত নিবন্ধটি দেখুন।
মূল তালিকার ক্রম সংরক্ষণ করে:dict.fromkeys(),sorted()
আপনি যদি মূল তালিকার ক্রম সংরক্ষণ করতে চান, তাহলে অভিধান প্রকারের ক্লাস পদ্ধতি fromkeys() বা বিল্ট-ইন ফাংশন sorted() ব্যবহার করুন।
dict.fromkeys() একটি নতুন অভিধান অবজেক্ট তৈরি করে যার কীগুলি আর্গুমেন্টে নির্দিষ্ট করা তালিকা, টিপল ইত্যাদি। যদি দ্বিতীয় যুক্তিটি বাদ দেওয়া হয়, তাহলে মানটি নেই।
যেহেতু অভিধান কীগুলিতে সদৃশ উপাদান নেই, তাই সদৃশ মানগুলি সেট() হিসাবে উপেক্ষা করা হয়। উপরন্তু, একটি ডিকশনারি অবজেক্ট লিস্ট()-এ একটি আর্গুমেন্ট হিসেবে পাস করা যেতে পারে একটি তালিকা পেতে যার উপাদান হল অভিধান কী।
print(dict.fromkeys(l))
# {3: None, 2: None, 1: None, 5: None, 4: None}
print(list(dict.fromkeys(l)))
# [3, 2, 1, 5, 4]
Python 3.7 (CPython হল 3.6) থেকে এটা নিশ্চিত করা হয়েছে যে dict.fromkeys() আর্গুমেন্ট সিকোয়েন্সের ক্রম সংরক্ষণ করে। পূর্ববর্তী সংস্করণগুলি নিম্নরূপ বিল্ট-ইন ফাংশন sorted() ব্যবহার করে।
সাজানো আর্গুমেন্ট কী-এর জন্য তালিকা টিপল মেথড ইনডেক্স() উল্লেখ করুন, যা উপাদানগুলির একটি সাজানো তালিকা প্রদান করে।
index() হল একটি পদ্ধতি যা মূল তালিকার ক্রম অনুসারে তালিকা সাজানোর জন্য মানের (তালিকার উপাদানের সংখ্যা) সূচক প্রদান করে, যা sorted() এর কী হিসাবে নির্দিষ্ট করা যেতে পারে। আর্গুমেন্ট কী একটি কলযোগ্য (কলযোগ্য) বস্তু হিসাবে নির্দিষ্ট করা হয়েছে, তাই () লিখবেন না।
print(sorted(set(l), key=l.index))
# [3, 2, 1, 5, 4]
দ্বি-মাত্রিক অ্যারে (তালিকার তালিকা)
দ্বি-মাত্রিক অ্যারেগুলির জন্য (তালিকাগুলির তালিকা), সেট() বা dict.fromkeys() ব্যবহার করে একটি TypeError হয়।
l_2d = [[1, 1], [0, 1], [0, 1], [0, 0], [1, 0], [1, 1], [1, 1]]
# l_2d_unique = list(set(l_2d))
# TypeError: unhashable type: 'list'
# l_2d_unique_order = dict.fromkeys(l_2d)
# TypeError: unhashable type: 'list'
এর কারণ হল অ-হ্যাশযোগ্য বস্তু যেমন তালিকা টাইপ সেটের উপাদান বা টাইপ ডিক্টের কী হতে পারে না।
নিম্নলিখিত ফাংশন সংজ্ঞায়িত করুন মূল তালিকার ক্রম সংরক্ষিত এবং এক-মাত্রিক তালিকা এবং টিপলের জন্য কাজ করে।
def get_unique_list(seq):
seen = []
return [x for x in seq if x not in seen and not seen.append(x)]
print(get_unique_list(l_2d))
# [[1, 1], [0, 1], [0, 0], [1, 0]]
print(get_unique_list(l))
# [3, 2, 1, 5, 4]
তালিকা বোঝার স্বরলিপি ব্যবহার করা হয়।
এখানে, আমরা নিম্নলিখিত ব্যবহার করি
- যদি এবং অপারেটরের শর্ট-সার্কিট মূল্যায়নে “X এবং Y”-এ X মিথ্যা হয়, তাহলে Y মূল্যায়ন করা হবে না (সম্পাদিত নয়)।
- append() পদ্ধতি কোনটিই প্রদান করে না।
যদি মূল তালিকা seq-এর উপাদানগুলি দেখাতে বিদ্যমান না থাকে, তাহলে এবং পরে মূল্যায়ন করা হয়।
see.append(x) কার্যকর করা হয় এবং এলিমেন্টটি দেখাতে যোগ করা হয়।
কারণ append() মেথড None প্রদান করে এবং None is False, not seen.append(x) সত্যে মূল্যায়ন করে।
তালিকা বোঝার স্বরলিপিতে শর্তসাপেক্ষ অভিব্যক্তিটি সত্য হয়ে ওঠে এবং চূড়ান্ত উৎপন্ন তালিকার একটি উপাদান হিসাবে যোগ করা হয়।
যদি মূল তালিকা seq-এর উপাদানগুলি দেখায় উপস্থিত থাকে, তাহলে x না দেখা হয় False, এবং তালিকা বোঝার অভিব্যক্তির শর্তসাপেক্ষ অভিব্যক্তিটি False।
অতএব, তারা চূড়ান্ত উত্পন্ন তালিকার উপাদান হিসাবে যোগ করা হয় না.
আরেকটি পদ্ধতি হল NumPy এর ফাংশন np.unique() এ আর্গুমেন্ট অক্ষ সেট করা, যদিও ফলাফলটি সাজানো হবে।
সদৃশ উপাদানগুলি বের করুন এবং একটি নতুন তালিকা তৈরি করুন
মূল তালিকার ক্রম সংরক্ষণ করবেন না
মূল তালিকা থেকে শুধুমাত্র ডুপ্লিকেট উপাদান বের করতে, collections.Counter() ব্যবহার করুন।
কি হিসাবে উপাদান এবং মান হিসাবে উপাদানের সংখ্যা সহ একটি সংগ্রহ. কাউন্টার (অভিধানের একটি উপশ্রেণী) প্রদান করে
import collections
l = [3, 3, 2, 1, 5, 1, 4, 2, 3]
print(collections.Counter(l))
# Counter({3: 3, 2: 2, 1: 2, 5: 1, 4: 1})
যেহেতু এটি অভিধানের একটি সাবক্লাস, তাই আইটেম() কী এবং মান পুনরুদ্ধার করতে ব্যবহার করা যেতে পারে। এটি কীগুলি বের করার জন্য যথেষ্ট যার সংখ্যা দুই বা তার বেশি।
print([k for k, v in collections.Counter(l).items() if v > 1])
# [3, 2, 1]
মূল তালিকার ক্রম সংরক্ষণ করে
উপরের উদাহরণে যেমন দেখানো হয়েছে, পাইথন 3.7 থেকে, সংগ্রহের কী। কাউন্টার মূল তালিকার ক্রম ধরে রাখে এবং আরও অনেক কিছু।
আগের সংস্করণে, সর্টেড() দিয়ে সাজানো যথেষ্ট, যেমন ডুপ্লিকেট উপাদান মুছে ফেলা হয়।
print(sorted([k for k, v in collections.Counter(l).items() if v > 1], key=l.index))
# [3, 2, 1]
আপনি যদি ডুপ্লিকেট যেমন আছে তেমনই বের করতে চান, তাহলে মূল তালিকা থেকে দুই বা তার বেশি সংখ্যা সহ উপাদানগুলি ছেড়ে দিন। আদেশও সংরক্ষিত।
cc = collections.Counter(l)
print([x for x in l if cc[x] > 1])
# [3, 3, 2, 1, 1, 2, 3]
দ্বি-মাত্রিক অ্যারে (তালিকার তালিকা)
দ্বি-মাত্রিক অ্যারেগুলির জন্য (তালিকাগুলির তালিকা), নিম্নলিখিত ফাংশনগুলি সম্ভব যখন মূল তালিকার ক্রম ধরে রাখা হয় না এবং যখন এটি যথাক্রমে বজায় রাখা হয়। এটি এক-মাত্রিক তালিকা এবং টিপলের জন্যও কাজ করে।
l_2d = [[1, 1], [0, 1], [0, 1], [0, 0], [1, 0], [1, 1], [1, 1]]
def get_duplicate_list(seq):
seen = []
return [x for x in seq if not seen.append(x) and seen.count(x) == 2]
def get_duplicate_list_order(seq):
seen = []
return [x for x in seq if seq.count(x) > 1 and not seen.append(x) and seen.count(x) == 1]
print(get_duplicate_list(l_2d))
# [[0, 1], [1, 1]]
print(get_duplicate_list_order(l_2d))
# [[1, 1], [0, 1]]
print(get_duplicate_list(l))
# [3, 1, 2]
print(get_duplicate_list_order(l))
# [3, 2, 1]
আপনি যদি সদৃশ দিয়ে বের করতে চান, তাহলে মূল তালিকা থেকে দুই বা ততোধিক গণনা সহ উপাদানগুলি ছেড়ে দিন।
print([x for x in l_2d if l_2d.count(x) > 1])
# [[1, 1], [0, 1], [0, 1], [1, 1], [1, 1]]
উল্লেখ্য যে যেহেতু count() এর কম্পিউটেশনাল জটিলতা হল O(n), তাই উপরে দেখানো ফাংশনটি যেটি বারবার count() চালায় তা খুবই অদক্ষ। একটি স্মার্ট উপায় হতে পারে.
কাউন্টার হল অভিধানের একটি সাবক্লাস, তাই আপনি যদি একটি তালিকা বা টিপল পাস করেন যার উপাদানগুলি তালিকা বা অন্যান্য নন-হ্যাশযোগ্য বস্তু সংগ্রহে। কাউন্টার(), একটি ত্রুটি ঘটবে এবং আপনি এটি ব্যবহার করতে পারবেন না।
# print(collections.Counter(l_2d))
# TypeError: unhashable type: 'list'