33

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

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

入力:

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

出力:

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

3 に答える 3

56

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

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

in という名前の関数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', False)forAntおよび('ANT', True)for を生成しantます。Trueは後Falseにソートされるため、大文字の単語は対応する小文字の前にソートされます。

詳細については、Python ソート HOWTOを参照してください。

于 2012-12-19T14:48:18.243 に答える
25

Python 3 の新しい回答です。次の 2 点を追加します。

  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"ます。

于 2018-05-20T17:53:54.617 に答える
4

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

ここで提案されている大文字と小文字を区別しない並べ替えは、「等しい」キーの順序で安定していません!

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

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

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

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

于 2019-09-13T12:15:58.730 に答える