केस-असंवेदनशील सूची छँटाई, परिणाम निकाले बिना?


133

मेरे पास इस तरह के तार की एक सूची है:

['Aden', 'abel']

मैं आइटम सॉर्ट करना चाहता हूं, केस-असंवेदनशील। इसलिए मैं पाना चाहता हूं:

['abel', 'Aden']

लेकिन मैं इसके साथ sorted()या इसके विपरीत मिलता हूं list.sort(), क्योंकि अपरकेस लोअरकेस से पहले दिखाई देता है।

मैं मामले को कैसे अनदेखा कर सकता हूं? मैंने ऐसे समाधान देखे हैं जिनमें सभी सूची वस्तुओं को कम करना शामिल है, लेकिन मैं सूची मदों के मामले को बदलना नहीं चाहता।


यह ट्यूटोरियल बहुत मददगार है: docs.python.org/3/howto/sorting.html#sortinghowto
ady

जवाबों:


192

पायथन 3.3+ में वह 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
एक से लैम्ब्डा समारोह गोल यात्रा से बच सकते हैं (अजगर 3) सामान्य का उपयोग कर str.lowerके रूप में समारोह sorted(lst, key=str.lower)या (अजगर 2) का उपयोग कर lowerकी विधि stringमॉड्यूल के रूप में sorted(lst, key=string.lower)। एक भी उपयोग कर सकते हैं str.lowerअजगर 2 में तार के लिए है, लेकिन फिर उपयोग करना होगा unicode.lowerके लिए unicodeवस्तुओं, जबकि string.lowerदोनों स्वीकार करता है (जो, जैसा कि आप कहते हैं, शायद नहीं वास्तव में आपरेशन के एक "समझदार" मोड, हालांकि है)।
डैनियल एंडरसन

यह ['Z', 'B', 'a', 'b', 'A'] जैसी सूची के लिए काम नहीं करेगा, जो कि ['a', 'A', 'B', 'b', 'Z']। राजधानी 'बी' लोअरकेस 'बी' से पहले दिखाई देती है क्योंकि पायथन का क्रमबद्ध () और क्रमबद्ध () स्ट्रिंग्स मैच होने पर मूल क्रम को संरक्षित करता है। इस मामले में कैपिटल का उपयोग करते समय राजधानी 'बी' को लोअरकेस 'बी' से मेल खाना माना जाता है। यह हमेशा होता है यदि आप मामले को तुलना करने के लिए परिवर्तित करते हैं: सॉर्ट किए गए (स्पैम, कुंजी = str.lower) या सॉर्ट किए गए (स्पैम, कुंजी = str.upper) या सॉर्ट किए गए (स्पैम, कुंजी = str.casefold)।
पीजे सिंह

इसके बजाय इस समाधान का प्रयास करें: stackoverflow.com/a/1098160/10668287 । यह [will अदन ’, en अदन’] को सही ढंग से ['अदन ’, en अदन’] की तरह छांटेगा।
पीजे सिंह

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']

धन्यवाद। मुझे पता है कि मुझे पहले इसका उल्लेख करना चाहिए था, लेकिन मैंने सुना है कि यूनिकोड स्ट्रिंग (Py2) पर इस पद्धति का उपयोग करने में कोई समस्या है। अपको इस बारे में कुछ पता है?

वे सभी यूनिकोड हैं। धन्यवाद! एक और प्रश्न, इसे इस तरह से एक सूची में कैसे करें:[['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

Python3 में आप उपयोग कर सकते हैं

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

1

मैंने इसे पायथन 3.3 के लिए इस तरह से किया:

 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 OR 3 में (पायथन 2.7.17 और पायथन 3.6.9 में परीक्षण किया गया):

>>> 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
यह समाधान एक-लाइनर के पीड़ित होने पर ओवरकिल और अपठनीय है। यह पायथन के अलावा किसी अन्य भाषा में अधिक स्वीकार्य हो सकता है।
1
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.