পাইথন যে কোনও কারণেই প্রাকৃতিক বাছাইয়ের অন্তর্নির্মিত পদ্ধতিতে আসে না (অর্থাত 1, 2, 10 এর পরিবর্তে 1, 10, 2), তাই আপনাকে এটি নিজে লিখতে হবে:
import re
def sorted_alphanumeric(data):
convert = lambda text: int(text) if text.isdigit() else text.lower()
alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ]
return sorted(data, key=alphanum_key)
আপনি এখন একটি তালিকা বাছাই করতে এই ফাংশনটি ব্যবহার করতে পারেন:
dirlist = sorted_alphanumeric(os.listdir(...))
সমস্যাগুলি:
আপনি যদি উপরের ফাংশনটি স্ট্রিংগুলি সাজানোর জন্য (উদাহরণস্বরূপ ফোল্ডারের নাম) ব্যবহার করেন এবং উইন্ডোজ এক্সপ্লোরারের মতো সেগুলি সাজানোর জন্য চান তবে এটি কিছু প্রান্তের ক্ষেত্রে সঠিকভাবে কাজ করবে না।
এই বাছাই ফাংশনটি যদি উইন্ডোতে নির্দিষ্ট 'বিশেষ' অক্ষরের সাথে ফোল্ডারের নাম থাকে তবে এটি ভুল ফলাফলগুলি প্রদর্শন করবে। উদাহরণস্বরূপ এই ফাংশনটি বাছাই করবে 1, !1, !a, a
, যেখানে উইন্ডোজ এক্সপ্লোরার বাছাই করবে !1, 1, !a, a
।
সুতরাং আপনি যদি উইন্ডোজ এক্সপ্লোরার পাইথনে ঠিক ঠিক সাজানোর জন্য আপনাকে উইন্ডোজ অন্তর্নির্মিত ফাংশন StrCmpLogicalW ব্যবহার করতে হবে সিটিপসের মাধ্যমে (অবশ্যই এটি ইউনিক্সে কাজ করবে না):
from ctypes import wintypes, windll
from functools import cmp_to_key
def winsort(data):
_StrCmpLogicalW = windll.Shlwapi.StrCmpLogicalW
_StrCmpLogicalW.argtypes = [wintypes.LPWSTR, wintypes.LPWSTR]
_StrCmpLogicalW.restype = wintypes.INT
cmp_fnc = lambda psz1, psz2: _StrCmpLogicalW(psz1, psz2)
return sorted(data, key=cmp_to_key(cmp_fnc))
এই ফাংশনটি তুলনায় কিছুটা ধীর sorted_alphanumeric()
।
বোনাস: উইন্ডোজে সম্পূর্ণ পাথ বাছাইwinsort
করতে পারে ।
বিকল্পভাবে, বিশেষত আপনি যদি ইউনিক্স ব্যবহার করেন তবে আপনি natsort
লাইব্রেরিটি ( pip install natsort
) সঠিক পথ দিয়ে বাছাই করতে (অর্থ সঠিক পজিশনে সাবফোল্ডারগুলি) ব্যবহার করতে পারেন ।
সম্পূর্ণ পাথ বাছাই করতে আপনি এটি ব্যবহার করতে পারেন:
from natsort import natsorted, ns
dirlist = natsorted(dirlist, alg=ns.PATH | ns.IGNORECASE)
এটি কেবল ফোল্ডারের নামগুলি (বা সাধারণভাবে স্ট্রিং) বাছাই করার জন্য ব্যবহার করবেন না, কারণ এটি sorted_alphanumeric()
উপরের ফাংশনটির চেয়ে খানিকটা ধীর ।
natsorted
আপনার লাইব্রেরি দেব ভুল যদি আপনি আশা করতে উইন্ডোজ এক্সপ্লোরার বাছাই, তাই ব্যবহার ফলাফলে winsort()
যে জন্য।