web-dev-qa-db-ja.com

結果を下げることなく、大文字と小文字を区別しないリストのソート?

次のような文字列のリストがあります。

_['Aden', 'abel']
_

大文字と小文字を区別せずにアイテムを並べ替えます。だから私は取得したい:

_['abel', 'Aden']
_

しかし、sorted()またはlist.sort()では反対になります。大文字が小文字の前に現れるためです。

ケースを無視するにはどうすればよいですか?すべてのリストアイテムを下げることを含むソリューションを見てきましたが、リストアイテムの大文字と小文字を変更したくありません。

106
user975135

以下はPython 2:

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

これらは両方ともlowerメソッドを持っているため、通常の文字列とUnicode文字列の両方で機能します。

Python 2では、2つのタイプの値を相互に比較できるため、通常の文字列とUnicode文字列の混在に対して機能します。Python 3は、ただし、バイト文字列とUnicode文字列を比較することはできません。したがって、Python 3では、正しいことを行い、1種類の文字列のリストのみをソートする必要があります。

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

python 3.3)なので、ケースレスマッチング用に特別に設計され、str.casefoldの代わりに使用できる str.lower メソッドもあります。

sorted_list = sorted(unsorted_list, key=lambda s: s.casefold())
148
user25148
>>> x = ['Aden', 'abel']
>>> sorted(x, key=str.lower) # Or unicode.lower if all items are unicode
['abel', 'Aden']

Python 3 strはユニコードですが、Python 2では、strおよびunicode

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

これを試すこともできます:

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

Python3では、使用できます

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

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]

次に、この関数を呼び出すことができます。

sortCaseIns(yourListToSort)
1

これはPython 3で機能し、結果の小文字化は含まれません(!)。

values.sort(key=str.lower)
1
M14