Python での並べ替え

並べ替えを行う最も簡単な方法は、sorted(list) 関数を使用することです。この関数はリストを受け取り、それらの要素を並べ替えた順序で含む新しいリストを返します。元のリストは変更されません。

  a = [5, 1, 4, 3]
  print(sorted(a))  ## [1, 3, 4, 5]
  print(a)  ## [5, 1, 4, 3]

最も一般的なのは、sorted() 関数にリストを渡す方法ですが、実際には、任意の種類の反復可能なコレクションを入力として受け取ることができます。古い list.sort() メソッドは、後述する代替手段です。sort() 関数を使用する方が、sort() よりも使いやすいと思うので、sorted() を使用することをおすすめします。

sort() 関数は、オプションの引数を使用してカスタマイズできます。sort() のオプションの引数 verse=True。例:sort(list,verse=True) は、逆に並べ替えます。

  strs = ['aa', 'BB', 'zz', 'CC']
  print(sorted(strs))  ## ['BB', 'CC', 'aa', 'zz'] (case sensitive)
  print(sorted(strs, reverse=True))   ## ['zz', 'aa', 'CC', 'BB']

Key= によるカスタム並べ替え

より複雑なカスタム並べ替えの場合、sort() はオプションの「key=」を受け取ります。「キー」を指定する比較の前に各要素を変換する関数ですkey 関数は 1 つの値を受け取って 1 つの値と、返された「proxy」を返します。value は並べ替え内の比較に使用されます。

たとえば、文字列のリストで key=len(組み込みの len() 関数)を指定すると、文字列が長さの順(短い方から長い順)に並べ替えられます。並べ替えは、文字列ごとに len() を呼び出してプロキシの長さの値のリストを取得し、それらのプロキシ値で並べ替えます。

  strs = ['ccc', 'aaaa', 'd', 'bb']
  print(sorted(strs, key=len))  ## ['d', 'bb', 'ccc', 'aaaa']

key=len で並べ替えられた通話

別の例として、「str.lower」を指定すると、as a key 関数は、並べ替えで大文字と小文字を強制的に同じように扱う方法です。

  ## "key" argument specifying str.lower function to use for sorting
  print(sorted(strs, key=str.lower))  ## ['aa', 'BB', 'CC', 'zz']

次のように、独自の MyFn をキー関数として渡すこともできます。

  ## Say we have a list of strings we want to sort by the last letter of the string.
  strs = ['xc', 'zb', 'yd' ,'wa']

  ## Write a little function that takes a string, and returns its last letter.
  ## This will be the key function (takes in 1 value, returns 1 value).
  def MyFn(s):
    return s[-1]

  ## Now pass key=MyFn to sorted() to sort by the last letter:
  print(sorted(strs, key=MyFn))  ## ['wa', 'zb', 'xc', 'yd']

姓、名で並べ替えるなど、より複雑な並べ替えには、 次のような itemgetter または attrgetter 関数を使用できます。

  from operator import itemgetter

  # (first name, last name, score) tuples
  grade = [('Freddy', 'Frank', 3), ('Anil', 'Frank', 100), ('Anil', 'Wang', 24)]
  sorted(grade, key=itemgetter(1,0))
  # [('Anil', 'Frank', 100), ('Freddy', 'Frank', 3), ('Anil', 'Wang', 24)]

  sorted(grade, key=itemgetter(0,-1))
  #[('Anil', 'Wang', 24), ('Anil', 'Frank', 100), ('Freddy', 'Frank', 3)]

sort() メソッド

sort() の代わりに、リストの sort()メソッドを使用して、そのリストを昇順で並べ替えます。次に例を示します。list.sort() を使用します。sort() メソッドは基になるリストを変更して None を返すため、次のように使用します。

  alist.sort()            ## correct
  alist = blist.sort()    ## Incorrect. sort() returns None

上記は、sort() と非常によく誤解され、並べ替えられたリストを返さないものです。sort() メソッドはリストに対して呼び出す必要があります。列挙可能なコレクションでは機能しません(ただし、上記の sorted()関数はどの対象でも機能します)。並べ替え(sort())メソッドは、sorted() 関数よりも前から存在するため、古いコードでも見つかるでしょう。sort() メソッドでは新しいリストを作成する必要はないので、並べ替える要素がすでにリストに含まれている場合は、この方法のほうが少し速くなります。

タプル

タプルは、(x, y)座標のような、要素の固定サイズのグループです。タプルはリストに似ていますが、不変であり、サイズを変更しない点が異なります(タプルは、含まれている要素の 1 つが可変である可能性があるため、厳密には不変ではありません)。タプルは一種の「構造体」を再生ロールを渡しています。これは、少し論理的で固定サイズの値のバンドルを渡すのに便利な方法です。複数の値を返す必要がある関数は、値のタプルを返すだけで済みます。たとえば、3 次元座標のリストが必要な場合、自然な Python 表現はタプルのリストになります。ここで、各タプルはサイズ 3 で、1 つの (x, y, z) グループが含まれています。

タプルを作成するには、かっこ内の値をカンマで区切ってリストします。「空」タプルは単なるかっこの空のペアです。タプル内の要素へのアクセスはリストに似ています。len()、[ ]、for、in などはすべて同じように機能します。

  tuple = (1, 2, 'hi')
  print(len(tuple))  ## 3
  print(tuple[2])    ## hi
  tuple[2] = 'bye'  ## NO, tuples cannot be changed
  tuple = (1, 2, 'bye')  ## this works

サイズ 1 のタプルを作成するには、1 つの要素の後にカンマを付ける必要があります。

  tuple = ('hi',)   ## size-1 tuple

構文では面白いかもしれませんが、カンマは、タプルと、式をかっこで囲む通常の場合を区別するために必要です。場合によっては、かっこを省略すると、Python はコンマからタプルであることがわかります。

タプルを同じサイズの変数名のタプルに割り当てると、対応するすべての値が割り当てられます。タプルのサイズが同じでない場合、エラーがスローされます。この機能はリストにも対応しています。

  (x, y, z) = (42, 13, "hike")
  print(z)  ## hike
  (err_string, err_code) = Foo()  ## Foo() returns a length-2 tuple

理解度を列挙する(省略可)

リスト理解機能はより高度な機能で、場合によっては便利ですが、この演習には必要ないほか、最初に学ぶ必要もありません(つまり、このセクションはスキップできます)。リストの理解は、リスト全体に展開される式を簡潔に記述する方法です。リスト nums [1, 2, 3, 4] がある場合、正方形のリスト [1, 4, 9, 16] を計算するためのリストの理解度は次のとおりです。

  nums = [1, 2, 3, 4]

  squares = [ n * n for n in nums ]   ## [1, 4, 9, 16]

構文は [ expr for var in list ] です。for var in list は通常の for ループに似ていますが、コロン(:)はありません。左側の expr が要素ごとに 1 回評価され、新しいリストの値が得られます。次に文字列の例を示します。各文字列は「!!!」で大文字に変換されます。追加:

  strs = ['hello', 'and', 'goodbye']

  shouting = [ s.upper() + '!!!' for s in strs ]
  ## ['HELLO!!!', 'AND!!!', 'GOODBYE!!!']

for ループの右側に if テストを追加して、結果を絞り込むことができます。if テストは、テストが true である要素のみを含め、要素ごとに評価されます。

  ## Select values <= 2
  nums = [2, 8, 1, 6]
  small = [ n for n in nums if n <= 2 ]  ## [2, 1]

  ## Select fruits containing 'a', change to upper case
  fruits = ['apple', 'cherry', 'banana', 'lemon']
  afruits = [ s.upper() for s in fruits if 'a' in s ]
  ## ['APPLE', 'BANANA']

演習: list1.py

このセクションの内容を練習するには、(基本演習に含まれる)並べ替えとタプルを使用する list1.py の後の問題に挑戦してください。