web-dev-qa-db-ja.com

ソートPython文字列の長さに基づいたリスト

文字列の長さに基づいて文字列のリストをソートしたい。次のようにソートを使用しようとしましたが、正しい結果が得られないようです。

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

何が悪いのでしょうか?

89
prosseek

lambdasortに渡す場合、ブール値ではなく整数を返す必要があります。したがって、コードは代わりに次のように読み取る必要があります。

_xs.sort(lambda x,y: cmp(len(x), len(y)))
_

cmp は、xyより小さい場合はcmp(x, y)が-1を返す組み込み関数であり、xの場合は0であることに注意してください。 _はyと等しく、xyより大きい場合は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)
_
170
Eli Courtwright

Eliの答えと同じ-ここではlambdaの部分をスキップできるため、短い形式を使用します。

新しいリストの作成:

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

インプレースソート:

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

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

デコレーション-ソート-デコレートのデザインパターン:

Pythonは、decorate-sort-undecorateデザインパターンと呼ばれるものを使用して、並べ替えが実装されている場合の主要な機能をサポートしています。

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

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

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

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

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

4
James Sapam

これを行う最も簡単な方法は:

list.sort(key = lambda x:len(x))

2
Chirag Patel

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

関数を使用して、以下の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)
0
Aashutosh
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
Saurabh Ariyan