文字列の長さに基づくPythonリストの並べ替え


110

文字列の長さに基づいて文字列のリストを並べ替えたいのですが。以下のようにsortを使ってみましたが、正しい結果が得られないようです。

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']

何が悪いのでしょうか?

回答:


201

あなたが通過するときlambdasort、あなたは整数ではなく、ブール値を返す必要があります。したがって、コードは次のように読み替える必要があります。

xs.sort(lambda x,y: cmp(len(x), len(y)))

cmpは組み込み関数でありcmp(x, y)xがより小さい場合は-1 yxが等しい場合は0、より大きいy場合xは1 を返すことに注意してくださいy

もちろん、代わりに次のkeyパラメータを使用できます。

xs.sort(key=lambda s: len(s))

これは、sortキー関数が返すものに基づいて順序付けするようにメソッドに指示します。

編集:len関数にキーパラメータとして直接渡すことができるため、以下のbalphaとRuslanに感謝しますlambda

xs.sort(key=len)

そして、Ruslanが以下で指摘するように、メソッドではなく組み込みのソート関数を使用することもできますlist.sort。これは、既存のリストをインプレースでソートするのではなく、新しいリストを作成します。

print(sorted(xs, key=len))

32
の必要はありませんlambda。使用するだけkey = len
balpha 2010

15
これは昇順で並べ替えます(上部の単語の長さが短い)、降順で並べ替える(下部の単語の長さが短い)パラメーターを追加しますreverse = True
Ajay Gupta

xs.sort()「:ソート()は位置引数をとらない例外TypeErrorが」スローします。代わりに、それがあるべきxs.sort(key=lambda x: len(x))
のHi-エンジェル

84

Eliの回答と同じ- lambdaここでは一部省略できるので、短い形式を使用します。

新しいリストを作成しています:

>>> xs = ['dddd','a','bb','ccc']
>>> sorted(xs, key=len)
['a', 'bb', 'ccc', 'dddd']

インプレースソート:

>>> xs.sort(key=len)
>>> xs
['a', 'bb', 'ccc', 'dddd']

5
長さでソートを逆にする方法は?
user2922935 2017年

1
@ user2922935:xs [::-1]を実行すると、すでにソートされているリストを逆にすることができます。Dan Baderの記事をチェックしてください:dbader.org/blog/python-reverse-list
Thyag

7
xs.sort(key=len, reverse=True)
Raz

5

ソート中にpythonic key関数がどのように機能するかを追加したいと思います:

装飾、並べ替え、装飾なしのデザインパターン:

装飾がソート、デコレートされていないデザインパターンとして知られているものを使用してソートが実装されているときのPythonのキー関数のサポート。

3つのステップで進行します。

  1. リストの各要素は、要素に適用されたキー関数の結果を含む「装飾」バージョンに一時的に置き換えられます。

  2. リストは、キーの自然な順序に基づいてソートされます。

  3. 装飾された要素は、元の要素に置き換えられます。

比較を行う前に各リスト要素で呼び出される関数を指定するキーパラメータ。docs



1

文字列のリストを長さに基づいてソートする関数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"])

0
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

これは私にとってはうまくいきます!


0

関数を使用して、以下の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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.