কেস-সংবেদনশীল তালিকার বাছাই, ফলাফল কমিয়ে না ফেলে?


133

আমার কাছে স্ট্রিংগুলির একটি তালিকা রয়েছে:

['Aden', 'abel']

আমি আইটেমগুলি বাছাই করতে চাই, কেস-সংবেদনশীল। সুতরাং আমি পেতে চাই:

['abel', 'Aden']

তবে আমি এর সাথে sorted()বা এর বিপরীতটি পাই list.sort()কারণ ছোট হাতের সামনে বড় হাতের অক্ষর উপস্থিত হয়।

আমি কীভাবে মামলাটিকে উপেক্ষা করতে পারি? আমি এমন সব সমাধান দেখেছি যার মধ্যে সমস্ত তালিকা আইটেমকে কম করা জড়িত, তবে আমি তালিকা আইটেমগুলির ক্ষেত্রে পরিবর্তন করতে চাই না।


এই টিউটোরিয়ালটি খুবই সহায়ক: docs.python.org/3/howto/sorting.html#sortinghowto
Ady

উত্তর:


192

পাইথন ৩.৩+ তে এমন str.casefoldপদ্ধতি রয়েছে যা বিশেষত কেসলেস ম্যাচের জন্য তৈরি করা হয়েছে:

sorted_list = sorted(unsorted_list, key=str.casefold)

পাইথন 2 ব্যবহার করুন lower():

sorted_list = sorted(unsorted_list, key=lambda s: s.lower())

এটি উভয়ই সাধারণ এবং ইউনিকোড স্ট্রিংয়ের জন্য কাজ করে, যেহেতু উভয়েরই একটি lowerপদ্ধতি রয়েছে।

পাইথন 2 এ এটি সাধারণ এবং ইউনিকোড স্ট্রিংগুলির মিশ্রণের জন্য কাজ করে, যেহেতু দুটি ধরণের মান একে অপরের সাথে তুলনা করা যায়। পাইথন 3 এর মতো কাজ করে না, যদিও: আপনি বাইট স্ট্রিং এবং একটি ইউনিকোড স্ট্রিং তুলনা করতে পারবেন না, তাই পাইথন 3 এ আপনার বুদ্ধিমান কাজ করা উচিত এবং কেবল এক ধরণের স্ট্রিংয়ের তালিকা বাছাই করা উচিত।

>>> lst = ['Aden', u'abe1']
>>> sorted(lst)
['Aden', u'abe1']
>>> sorted(lst, key=lambda s: s.lower())
[u'abe1', 'Aden']

11
One দ্বারা ল্যামডা ফাংশন roundtrip এড়াতে পারেন (পাইথন 3) সাধারণ ব্যবহার str.lowerযেমন ফাংশন sorted(lst, key=str.lower)বা (পাইথন 2) ব্যবহার lowerপদ্ধতি stringমডিউল যেমন sorted(lst, key=string.lower)। তোলা যায় ব্যবহার করতে পারেন str.lowerপাইথন 2 স্ট্রিং জন্য, কিন্তু তারপর ব্যবহার করতে হবে unicode.lowerজন্য unicodeবস্তু, যেহেতু string.lowerউভয় গ্রহণ (যা, আপনি এটা করা, সম্ভবত সত্যিই অপারেশন একটি "বিবেকী" মোড, যদিও)।
ড্যানিয়েল অ্যান্ডারসন

এটি ['জেড', 'বি', 'এ', 'বি', 'এ'] এর মতো তালিকার পক্ষে কাজ করবে না, যা ['এ', 'এ', 'বি', 'বি', 'জেড']। মূলধন 'বি' ছোট হাতের 'বি' এর আগে উপস্থিত হয় কারণ পাইথনের সাজানো () এবং সাজানো () স্ট্রিং মেলে যখন মূল ক্রম সংরক্ষণ করে। এক্ষেত্রে কেসফোল্ড ব্যবহার করার সময় রাজধানী 'বি' ছোট হাতের 'বি' এর সাথে মিলে যায়। আপনি যদি কেসটিকে তুলনা করার জন্য রূপান্তর করেন তবে সর্বদা এটি ঘটে: সাজানো (স্প্যাম, কী = স্ট্রোর ফ্লোয়ার) বা বাছাই করা (স্প্যাম, কী = স্ট্রিংআপার) বা বাছাই করা (স্প্যাম, কী = str.casefold)।
পিজে সিং

পরিবর্তে এই সমাধানটি ব্যবহার করে দেখুন: stackoverflow.com/a/1098160/10668287 । এটি ['অ্যাডেন', 'অ্যাডেন'] সঠিকভাবে ['অ্যাডেন', 'অ্যাডেন'] হিসাবে বাছাই করবে।
পিজে সিং

46
>>> x = ['Aden', 'abel']
>>> sorted(x, key=str.lower) # Or unicode.lower if all items are unicode
['abel', 'Aden']

পাইথন 3 strইউনিকোড কিন্তু পাইথন 2 আপনি এই আরও সাধারণ পদ্ধতির যা উভয়ের জন্য কাজ করে ব্যবহার করতে পারেন strএবং unicode:

>>> sorted(x, key=lambda s: s.lower())
['abel', 'Aden']

ধন্যবাদ. আমি জানি আমার আগে এটি উল্লেখ করা উচিত ছিল, তবে আমি শুনেছি একটি ইউনিকোড স্ট্রিং (পাই 2) এ এই পদ্ধতিটি ব্যবহার করতে সমস্যা আছে। ওটা সম্পর্কে কি আপনি কিছু জানেন?

তারা সবাই ইউনিকোড। ধন্যবাদ! আরও একটি প্রশ্ন, এটির মতো তালিকায় এটি কীভাবে করবেন:[['Aden'], ['abel']]

প্রতিটি তালিকায় কি কেবল একটি আইটেম রয়েছে? যদি তাই হয় তবে এটিতে কিছুটা পরিবর্তন করুন:sorted(x,key=lambda i:i[0].lower())
জামিলাক

ভাল, এটিতে অন্য কিছু জিনিসও থাকতে পারে, যা বাছাইয়ের জন্য ব্যবহার করা উচিত নয়।

1
কিছুই মনে হয় না, এটি প্রদর্শিত হয়েছিল যে আমি ভুল ছিল, বাছাই করা উভয় স্ট্রিং এবং ইউনিকোডের মিশ্রণের জন্য কাজ করে, আমি পূর্ববর্তী প্রশ্নে বিভ্রান্ত হয়েছিলাম যেখানে টিপলগুলিও বাছাইয়ের অন্তর্ভুক্ত ছিল।
জামিলাক

10

তালিকায় স্থানটি সাজানোর জন্য আপনি এটি ব্যবহার করে দেখতে পারেন:

>>> x = ['Aden', 'abel']
>>> x.sort(key=lambda y: y.lower())
>>> x
['abel', 'Aden']


3

পাইথন 3 এ আপনি ব্যবহার করতে পারেন

list1.sort(key=lambda x: x.lower()) #Case In-sensitive             
list1.sort() #Case Sensitive

1

পাইথন ৩.৩ এর জন্য আমি এটি এভাবে করেছি:

 def sortCaseIns(lst):
    lst2 = [[x for x in range(0, 2)] for y in range(0, len(lst))]
    for i in range(0, len(lst)):
        lst2[i][0] = lst[i].lower()
        lst2[i][1] = lst[i]
    lst2.sort()
    for i in range(0, len(lst)):
        lst[i] = lst2[i][1]

তারপরে আপনি কেবল এই ফাংশনটি কল করতে পারেন:

sortCaseIns(yourListToSort)

0

কেস-সংবেদনশীল বাছাই, স্ট্রিংটিকে স্থানে বাছাই করে পাইথন 2 বা 3 (পাইথন ২.7.১7 এবং পাইথন ৩.6.৯ এ পরীক্ষিত):

>>> x = ["aa", "A", "bb", "B", "cc", "C"]
>>> x.sort()
>>> x
['A', 'B', 'C', 'aa', 'bb', 'cc']
>>> x.sort(key=str.lower)           # <===== there it is!
>>> x
['A', 'aa', 'B', 'bb', 'C', 'cc']

চাবিটি হ'ল key=str.lower। সহজ কপি-পেস্ট করার জন্য এই কমান্ডগুলি কেবল কমান্ডগুলির সাথে দেখতে কেমন তাই আপনি সেগুলি পরীক্ষা করতে পারেন:

x = ["aa", "A", "bb", "B", "cc", "C"]
x.sort()
x
x.sort(key=str.lower)
x

মনে রাখবেন যে যদি আপনার স্ট্রিংগুলি ইউনিকোড স্ট্রিং হয় তবে (যেমন u'some string'), তবে পাইথন 2-এ কেবল (পাইথন 3 তে এই ক্ষেত্রে নয়) উপরের x.sort(key=str.lower)কমান্ডটি ব্যর্থ হবে এবং নিম্নলিখিত ত্রুটিটি আউটপুট করবে:

TypeError: descriptor 'lower' requires a 'str' object but received a 'unicode'

যদি আপনি এই ত্রুটিটি পান তবে তা পাইথন 3 এ আপগ্রেড করুন যেখানে তারা ইউনিকোড বাছাই পরিচালনা করে, অথবা আপনার ইউনিকোড স্ট্রিংগুলিকে প্রথমে ASCII স্ট্রিংগুলিতে রূপান্তর করুন, এর মতো একটি তালিকা বোধগম্যতা ব্যবহার করে:

# for Python2, ensure all elements are ASCII (NOT unicode) strings first
x = [str(element) for element in x]  
# for Python2, this sort will only work on ASCII (NOT unicode) strings
x.sort(key=str.lower)

তথ্যসূত্র:

  1. https://docs.python.org/3/library/stdtypes.html#list.sort
  2. একটি ইউনিকোড স্ট্রিংটি পাইথনের স্ট্রিংয়ে রূপান্তর করুন (অতিরিক্ত চিহ্ন সহ)
  3. https://www.programiz.com/python-programming/list-comprehension

-3

এটা চেষ্টা কর

def cSort(inlist, minisort=True):
    sortlist = []
    newlist = []
    sortdict = {}
    for entry in inlist:
        try:
            lentry = entry.lower()
        except AttributeError:
            sortlist.append(lentry)
        else:
            try:
                sortdict[lentry].append(entry)
            except KeyError:
                sortdict[lentry] = [entry]
                sortlist.append(lentry)

    sortlist.sort()
    for entry in sortlist:
        try:
            thislist = sortdict[entry]
            if minisort: thislist.sort()
            newlist = newlist + thislist
        except KeyError:
            newlist.append(entry)
    return newlist

lst = ['Aden', 'abel']
print cSort(lst)

আউটপুট

['abel', 'Aden']


9
এই দ্রবণটি ওভারকিল এবং অপঠনযোগ্য যখন কোনও ওয়ান-লাইনার যথেষ্ট হয়। পাইথন ব্যতীত অন্য কোনও ভাষায় এটি আরও গ্রহণযোগ্য হতে পারে।
আইসআর্ডার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.