hoofdletterongevoelige lijstsortering, zonder het resultaat in kleine letters te zetten?

Ik heb een lijst met strings zoals deze:

['Aden', 'abel']

Ik wil de items sorteren, niet hoofdlettergevoelig.
Dus ik wil:

['abel', 'Aden']

Maar ik krijg het tegenovergestelde met sorted()of list.sort(), omdat hoofdletters voor kleine letters verschijnen.

Hoe kan ik de zaak negeren? Ik heb oplossingen gezien waarbij alle lijstitems in kleine letters worden gebruikt, maar ik wil het hoofdlettergebruik van de lijstitems niet veranderen.


Antwoord 1, autoriteit 100%

In Python 3.3+ is er de str.casefoldmethode die speciaal is ontworpen voor het matchen zonder hoofdletters:

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

Gebruik in Python 2 lower():

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

Het werkt voor zowel normale als unicode-tekenreeksen, omdat ze allebei een lower-methode hebben.

In Python 2 werkt het voor een mix van normale en unicode-tekenreeksen, omdat waarden van de twee typen met elkaar kunnen worden vergeleken. Python 3 werkt echter niet zo: je kunt een byte-string en een unicode-string niet vergelijken, dus in Python 3 moet je het verstandige doen en alleen lijsten van één type string sorteren.

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

Antwoord 2, autoriteit 19%

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

In Python 3 is strunicode, maar in Python 2 kun je deze meer algemene benadering gebruiken die werkt voor zowel strals unicode:

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

Antwoord 3, autoriteit 5%

Je kunt dit ook proberen om de lijst ter plekke te sorteren:

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

Antwoord 4, autoriteit 2%

Dit werkt in Python 3 en vereist geen kleine letters van het resultaat (!).

values.sort(key=str.lower)

Antwoord 5

In python3 kun je

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

Antwoord 6

Ik deed het op deze manier voor Python 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]

Dan kun je deze functie gewoon aanroepen:

sortCaseIns(yourListToSort)

Antwoord 7

Hoofdlettergevoelig sorteren, de string op zijn plaatssorteren, in Python 2 OR 3 (getest in Python 2.7.17 en Python 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']

De sleutel is key=str.lower. Dit is wat die commando’s eruit zien met alleen de opdrachten, voor eenvoudige kopieën, zodat u ze kunt testen:

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

Merk op dat als uw snaren echter Unicode-snaren zijn (zoals u'some string'), dan in Python 2 alleen (niet in Python 3 in dit geval) het bovenstaande x.sort(key=str.lower)Opdracht mislukt en uitvoert de volgende foutmelding:

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

Als u deze foutmelding krijgt, kunt u upgraden naar Python 3, waar ze de Unicode-sortering afhandelen of eerst uw Unicode-strings naar ASCII-strings omzetten, met behulp van een lijst Begreefdy, zoals dit:

# 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)

Referenties:

  1. https://docs.python.org/3/library /sttypes.html#list.sort
  2. converteren een Unicode-string naar een string in Python (met extra symbolen)
  3. https://www.programiz.com/python-programming/list-comprestion

Antwoord 8

Probeer dit

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)

Uitgang

['abel', 'Aden']

Other episodes