文字列の長さに基づいて文字列のリストをソートしたい。次のようにソートを使用しようとしましたが、正しい結果が得られないようです。
xs = ['dddd','a','bb','ccc']
print xs
xs.sort(lambda x,y: len(x) < len(y))
print xs
['dddd', 'a', 'bb', 'ccc']
['dddd', 'a', 'bb', 'ccc']
何が悪いのでしょうか?
lambda
をsort
に渡す場合、ブール値ではなく整数を返す必要があります。したがって、コードは代わりに次のように読み取る必要があります。
_xs.sort(lambda x,y: cmp(len(x), len(y)))
_
cmp は、x
がy
より小さい場合はcmp(x, y)
が-1を返す組み込み関数であり、x
の場合は0であることに注意してください。 _はy
と等しく、x
がy
より大きい場合は1です。
もちろん、代わりにkey
パラメーターを使用できます。
_xs.sort(key = lambda s: len(s))
_
これは、キー関数が返すものに基づいてsort
メソッドに順序付けを指示します。
編集:len
を関数のキーパラメーターとして直接渡すことができることを指摘してくれたbalphaとRuslanに感謝します。したがって、lambda
は不要です。
_xs.sort(key = len)
_
また、Ruslanが以下で指摘しているように、既存のリストをその場でソートするのではなく、新しいリストを作成する_list.sort
_メソッドではなく、組み込みの sorted 関数を使用することもできます。
_print sorted(xs, key=len)
_
Eliの答えと同じ-ここではlambda
の部分をスキップできるため、短い形式を使用します。
新しいリストの作成:
>>> xs = ['dddd','a','bb','ccc']
>>> sorted(xs, key=len)
['a', 'bb', 'ccc', 'dddd']
インプレースソート:
>>> xs.sort(key=len)
>>> xs
['a', 'bb', 'ccc', 'dddd']
ソート中にPythonicキー関数がどのように機能するかを追加したいと思います。
デコレーション-ソート-デコレートのデザインパターン:
Pythonは、decorate-sort-undecorateデザインパターンと呼ばれるものを使用して、並べ替えが実装されている場合の主要な機能をサポートしています。
3つのステップで進行します:
リストの各要素は、要素に適用されたキー機能の結果を含む「装飾された」バージョンに一時的に置き換えられます。
リストは、キーの自然な順序に基づいてソートされます。
装飾された要素は、元の要素に置き換えられます。
比較を行う前に各リスト要素で呼び出される関数を指定するキーパラメーター。 ドキュメント
これを行う最も簡単な方法は:
list.sort(key = lambda x:len(x))
長さに基づいて文字列のリストをソートする関数lensortを作成します。
def lensort(a):
n = len(a)
for i in range(n):
for j in range(i+1,n):
if len(a[i]) > len(a[j]):
temp = a[i]
a[i] = a[j]
a[j] = temp
return a
print lensort(["hello","bye","good"])
関数を使用して、以下の2つの方法を使用してそれを行うことができます
def lensort(x):
list1 = []
for i in x:
list1.append([len(i),i])
return sorted(list1)
lista = ['a', 'bb', 'ccc', 'dddd']
a=lensort(lista)
print([l[1] for l in a])
Lambdaを使用する1つのライナーでは、以下のように、既に回答済みです。
lista = ['a', 'bb', 'ccc', 'dddd']
lista.sort(key = lambda x:len(x))
print(lista)
def lensort(list_1):
list_2=[];list_3=[]
for i in list_1:
list_2.append([i,len(i)])
list_2.sort(key = lambda x : x[1])
for i in list_2:
list_3.append(i[0])
return list_3
これは私のために働く!