2016-07-02 3 views
2

文字列のリストを指定すると、「x」で始まるすべての文字列をグループ化する以外は、並べ替えられた文字列のリストを返します。例えばアルファベット順のリストの並べ替え、特定の開始文字の特殊ケース付き

['mix', 'xyz', 'apple', 'xanadu', 'aardvark'] 

得られるはず:

['xanadu', 'xyz', 'aardvark', 'apple', 'mix'] 

を、私はそれが2つのリストを作り、それらを組み合わせる前に、それらのそれぞれをソートすることによって行うことができます知っているが、私は方法がわからないんだけど'x'が最初の文字である条件を記述します。

+0

と何をコーディングしようとしたんでしたか? – rsm

+0

rsm - 私は実際にこれでかなり新しいので、私は何をすべきか分からなかった。私はこのサイトや他のサイトを探して良い答えを出しましたが、何も見つかりませんでしたので、ここに投稿しました。すべてのあなたの答え、人々ありがとう! (と私の質問を編集するために、ウィルに)。 – Guy

答えて

1

キーメソッドで特定のケースを作成します:ifはxで始まり、 "0"で始まる切り詰め文字列を返します。最初に表示されますが、 "x"の後もソートされるようにします。

z=['mix', 'xyz', 'apple', 'xanadu', 'aardvark'] 

z.sort(key=lambda x : "0"+x if x.startswith("x") else x) 
print(z) 

収率:

['xanadu', 'xyz', 'aardvark', 'apple', 'mix'] 
1
>>> sorted(['mix', 'xyz', 'apple', 'xanadu', 'aardvark'], 
      key=lambda x: (not x.startswith('x'), x)) 
['xanadu', 'xyz', 'aardvark', 'apple', 'mix'] 

sorted()組み込みがkeyでソート、入力イテラブルの各要素の新しい、安定ソートlist()を返します。この場合、keyは入力リストの各要素をソート可能な値に変換または変換するlambda expression(基本的には「ミニ関数」)です。この場合

、我々のラムダ式は、単語は、単語自体、続い"x"始まるかどうかを示すFalse又はTrueを含むtuple()によってリスト内の各単語をソート。 FalseTrueより小さいため、"x"で始まる単語が最初に表示され、その他はすべてアルファベット順に並べ替えられます。

+0

こんにちは、コードに説明を追加していただけますか?これは、レビュー専用のキューにポップアップされました。コード専用の回答が多いようです。 – Will

+0

@私はそれが自明であると信じています。あなたはそうしない? –

+0

コードは経験豊富なPythonエンジニアとして私自身に語ります。しかし、これを遭遇した新しいユーザは、 'lambda'、 'sorted()'や 'str。startswith() 'さらに、明白な英語の説明を追加することは、SOの文化の一部にすぎません(実際の要件であるかどうかは不明です)。私は例として、私が話している簡単な説明のタイプを追加します。自由に改善してください。 – Will

5

sortedまたはlist.sortは、オプションのkeyキーワード引数を受け入れます。これはソートキーを取得するために使用される関数であり、関数の戻り値は元のアイテムの代わりに比較するために使用されます。

>>> words = ['mix', 'xyz', 'apple', 'xanadu', 'aardvark'] 
>>> sorted(words, key=lambda word: (word[0] != 'x', word)) 
['xanadu', 'xyz', 'aardvark', 'apple', 'mix'] 

word[0] != 'x';単語のためにFalse(0)を返すのは、xTrue(1)で始まります。結果の単語はxで始まります。

0

あなたは、組み込みのlist.sort()使用してそれを並べ替えた後、次のようにあなたが望む出力を取得するには、リストの内包表記を使用することができます。

sl = ['mix', 'xyz', 'apple', 'xanadu', 'aardvark'] 
sl.sort() 
sl = [el for el in sl if el.startswith("x")]+[el for el in sl if not el.startswith("x")] 
2
words = ['mix', 'xyz', 'apple', 'xanadu', 'aardvark'] 
result = [i for _, i in sorted((word[0]!='x', word) for word in words)] 
+0

こんにちは、コードに説明を追加していただけますか? – Will

+0

変数名として '_'を使うのは間違いです。私はそれが働いたことさえ知りませんでした。地獄のような謎!返されたキーはタプルであり、タプルのソートは最初の値を試して動作するということを説明してください。 –

関連する問題