🐥

PythonとJavaScriptのsort関数における複数の項目を並び替える記述の違いについて

2025/01/31に公開

PythonとJavaScriptのsort関数の違いについて

PythonとJavaScriptには、それぞれ独自の方法でリストや辞書をソートする機能があります。この記事では、特に多次元リストや辞書をソートする方法について、PythonとJavaScriptの実装を比較してみましょう。

Pythonのソート

Pythonでは、sorted関数を使用してリストや辞書をソートすることができます。sorted関数は新しいリストを返し、元のリストは変更されません。

多次元リストのソート

例えば、以下のような多次元リストをソートする場合を考えます。

data = [['きゅうり', 2, 4], ['いちご', 2, 6], ['にんじん', 2, 1], ['とうふ', 1, 0]];

このリストを第2要素と第3要素でソートするには、sorted関数とlambda関数を使用します。

sorted_data = sorted(data, key=lambda x: (x[1], x[2]))
print(sorted_data)

sorted_data = sorted(data, key=lambda x: (-x[1], x[2]))

このままだと全ての項目で昇順ソートされるが、一部のキーでは降順ソートしたい場合は、
一部の要素をマイナスとすればよい。ただし値が数値型に限るので
もし文字列も優先してsortしたい場合は、sorted関数を二回使うことになり、一番優先したい要素を先にsorted関数を用いる

辞書のソート

辞書をキーやバリューでソートする場合も、sorted関数を使用します。

score = {'kokugo': 33, 'sansuu': 85, 'eigo': 60}

# キーでソート
sorted_by_key = dict(sorted(score.items()))
print(sorted_by_key)

# バリューでソート
sorted_by_value = dict(sorted(score.items(), key=lambda item: item[1]))
print(sorted_by_value)
リスト内の辞書を複数キーでソート

リスト内の辞書を複数キーでソートする場合も、sorted関数を使用します。

item_list = [{"id": 2, "category_no": 2}, {"id": 1, "category_no": 2}, {"id": 3, "category_no": 1}]

sorted_item_list = sorted(item_list, key=lambda x: (x['category_no'], x['id']))
print(sorted_item_list)

JavaScriptのソート

JavaScriptでは、sortメソッドを使用してリストやオブジェクトをソートします。sortメソッドは元の配列を変更します。ただ、JavaScriptにも元の配列に影響を与えない toSorted メソッドもあります

多次元リストのソート

例えば、以下のような多次元リストをソートする場合を考えます。

let data = [['きゅうり', 2, 4], ['いちご', 2, 6], ['にんじん', 2, 1], ['とうふ', 1, 0]];

このリストを第2要素と第3要素でソートするには、sortメソッドとカスタム比較関数を使用します。

data.sort((a, b) => {
  if (a[1] === b[1]) {
    return a[2] - b[2];
  } else {
    return a[1] - b[1];
  }
});
console.log(data);

ただし少し冗長になるので、|| 論理演算子を用いて以下のように記述するのがベターである。
この場合は 先に書かれた条件が優先されてsortされる。

[...data].sort((a,b) => a[1]-b[1] || a[2]-b[2])
オブジェクトのソート

オブジェクトをキーやバリューでソートする場合、まずオブジェクトを配列に変換してからソートします。

let score = {'kokugo': 33, 'sansuu': 85, 'eigo': 60};

// キーでソート
let sortedByKey = Object.fromEntries(Object.entries(score).sort());
console.log(sortedByKey);

// バリューでソート
let sortedByValue = Object.fromEntries(Object.entries(score).sort((a, b) => a[1] - b[1]));
console.log(sortedByValue);
配列内のオブジェクトを複数キーでソート

配列内のオブジェクトを複数キーでソートする場合も、sortメソッドを使用します。

let item_list = [{"id": 2, "category_no": 2}, {"id": 1, "category_no": 2}, {"id": 3, "category_no": 1}];

item_list.sort((a, b) => {
  if (a.category_no === b.category_no) {
    return a.id - b.id;
  } else {
    return a.category_no - b.category_no;
  }
});
console.log(item_list);

まとめ

PythonとJavaScriptのソート関数は、それぞれの言語の特性に合わせて使い分けることが重要です。Pythonのsorted関数は新しいリストを返すため、元のリストを変更せずにソートを行いたい場合に便利です。一方、JavaScriptのsortメソッドは元の配列を変更するため、直接ソートを行いたい場合に適しています。どちらの言語でも、カスタム比較関数を使用することで、複雑なソート条件にも対応できます。

Discussion