এক লিস্ট থেকে যেসব এলিমেন্ট মনো-ডিজিট (সকল ডিজিট একই, যেমন ১১১, ৭৭৭৭, ৫) সেগুলো বের করার জন্য লিস্ট কম্প্রিহেনশন, all() এবং স্ট্রিং কম্পারিজন ব্যবহার করা হয়।
উদাহরণ
my_list = [863, 1, 463, "pyt", 782, 241, "is", 639, 4, "fun"]
print("লিস্ট:", my_list)
# মনো-ডিজিট চেক: স্ট্রিংয়ের সব ক্যারেক্টার প্রথম ক্যারেক্টার সমান
mono_digits = [
x for x in my_list
if isinstance(x, int) and all(ch == str(x)[0] for ch in str(x))
]
print("মনো-ডিজিট এলিমেন্ট:", mono_digits)
আউটপুট
লিস্ট: [863, 1, 463, 'pyt', 782, 241, 'is', 639, 4, 'fun']
মনো-ডিজিট এলিমেন্ট: [1, 4]
ব্যাখ্যা
isinstance(x, int)— শুধু ইন্টিজার চেক (স্ট্রিং বাদ)str(x)— সংখ্যাকে স্ট্রিংে রূপান্তরall(ch == str(x)[0] for ch in str(x))— সব ডিজিট প্রথম ডিজিটের সমান কিনা- ১ → "১" (১ ডিজিট, স্বয়ংক্রিয় মনো-ডিজিট)
- ৪ → "৪" (১ ডিজিট)
- ১১, ২২২, ৭৭৭৭ — সব মনো-ডিজিট
রেগুলার এক্সপ্রেশন দিয়ে
import re
mono_digits = [
x for x in my_list
if isinstance(x, int) and re.fullmatch(r'(\d)\1*', str(x))
]
# (\d)\1* = একই ডিজিট এক বা অধিক বার
সেট দিয়ে (O(1) চেক)
mono_digits = [
x for x in my_list
if isinstance(x, int) and len(set(str(x))) == 1
]
# set(str(x)) → ইউনিক ডিজিটের সেট, দৈর্ঘ্য ১ মানে মনো-ডিজিট
len(set(str(x))) == 1 সবচেয়ে সংক্ষিপ্ত এবং পঠনযোগ্য।
নেগেটিভ সংখ্যা হ্যান্ডলিং
def is_mono_digit(n):
if not isinstance(n, int):
return False
s = str(abs(n)) # নেগেটিভ হলে '-' বাদ
return len(set(s)) == 1
# টেস্ট
print([x for x in [-111, -22, 333, -4444, 5] if is_mono_digit(x)])
# [-111, -22, 333, -4444, 5]