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
メソッドは元の配列を変更します。
多次元リストのソート
例えば、以下のような多次元リストをソートする場合を考えます。
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
メソッドは元の配列を変更するため、直接ソートを行いたい場合に適しています。どちらの言語でも、カスタム比較関数を使用することで、複雑なソート条件にも対応できます。