web-dev-qa-db-ja.com

大文字と小文字を無視して文字列のリストをソートする

動物の名前を表す文字列を含むリストがあります。リストを並べ替える必要があります。 sorted(list)を使用すると、最初に大文字の文字列、次に小文字の文字列でリストが出力されます。

しかし、私は以下の出力が必要です。

入力:

var = ['ant','bat','cat','Bat','Lion','Goat','Cat','Ant']

出力:

['ant', 'Ant', 'bat', 'Bat', 'cat', 'Cat', 'Goat', 'Lion']
25
Darknight

sort()メソッドとsorted()関数はキー引数を取ります:

var.sort(key=lambda v: v.upper())

keyで指定された関数は各値に対して呼び出され、戻り値はソート時に実際の値に影響を与えることなく使用されます。

>>> var=['ant','bat','cat','Bat','Lion','Goat','Cat','Ant']
>>> sorted(var, key=lambda v: v.upper())
['ant', 'Ant', 'bat', 'Bat', 'cat', 'Cat', 'Goat', 'Lion']

Antの前にantを並べ替えるには、キーにもう少し情報を含める必要があります。そうしないと、等しい値が特定の順序で並べ替えられます。

>>> sorted(var, key=lambda v: (v.upper(), v[0].islower()))
['Ant', 'ant', 'Bat', 'bat', 'Cat', 'cat', 'Goat', 'Lion']

より複雑なキーは、Antの場合は('ANT', False)antの場合は('ANT', True)を生成します。 TrueFalseの後にソートされるため、大文字の単語は対応する小文字の前にソートされます。

詳細は Python sorting HOWTO を参照してください。

42
Martijn Pieters

Python= 3、3の新しい答えを追加したいと思います。

  1. 大文字と小文字を区別しない比較には _str.casefold_ を使用します。
  2. ラムダの内部ではなく、メソッドを直接使用します。

あれは:

_var = ['ant','bat','cat','Bat','Lion','Goat','Cat','Ant']

var.sort(key=str.casefold)
_

(これはインプレースでソートされます)そして今:

_>>> var
['ant', 'Ant', 'bat', 'Bat', 'cat', 'Cat', 'Goat', 'Lion']
_

または、新しいリストを返すには、sortedを使用します

_>>> var = ['ant','bat','cat','Bat','Lion','Goat','Cat','Ant']
>>> sorted(var, key=str.casefold)
['ant', 'Ant', 'bat', 'Bat', 'cat', 'Cat', 'Goat', 'Lion']
_

これが_str.lower_または_str.upper_と異なるのはなぜですか? ドキュメントによると:

大文字と小文字の区別は小文字に似ていますが、文字列内のすべての大文字と小文字の区別を取り除くことを目的としているため、より積極的です。たとえば、ドイツ語の小文字_'ß'_は_"ss"_と同等です。既に小文字なので、str.lower()は_'ß'_に対して何もしません。 casefold()はそれを_"ss"_に変換します。

16
Aaron Hall

Python Sorting HOW TOドキュメントに従って、「sorted」関数を使用できます。

a = sorted(Input, key=str.lower)print("Output1: ",a)

出力1:

['ant', 'Ant', 'bat', 'Bat', 'cat', 'Cat', 'Goat', 'Lion']
2
Ahmed

受け入れられた回答と新しいバージョンの両方1つの重要なものが欠けているなので、私はさらに別の回答を追加する必要があります。

ここで提案されている大文字と小文字を区別しないソート安定していない「等しい」キーの順序付け!

つまり、並べ替える大文字と小文字が混在する文字列が混在している場合、正しく並べ替えられたリストが表示されますが、「AbC」が「aBc」の前か後かは定義されていません。これは、同じプログラムの実行間でも異なる場合があります。

文字列の安定したデフォルトの順序で常に同じ出力を得るには、次の関数を使用します。

sorted(var, key=lambda v: (v.casefold(), v))

このように、ケースフォールドバージョンがソートの違いを提供しない場合、元のキーは常にフォールバック順序として追加されます。

2