💭

JavaScriptの連想配列をPythonの辞書のように特定のキーを指定しながら、順序を保ちながらソートする方法

2025/01/31に公開

例えば 商品という key 、値段という value が あり、値段 ごとに降順で並べ上位3つのみを取得するというタスクがあったとする。

[ 'Computer', 'Cell Phones', 'Vacuum Cleaner','Autos' ] #商品名
[ 597, 7176, 3192,597 ] #値段のリスト

Pythonでこのような問題を考える

{'Computer': 597, 'Cell Phones': 7176, 'Vacuum Cleaner': 3192, 'Autos': 597}

上記のような辞書が用意されたときにforなどで 辞書型を作成し、sorted関数で keyを指定すれば、値が同じ(今回であればComputerとAutos)ものであれば早く登場したComputerが優先される。

def top3(price):
    return list(dict(sorted(price.items(),key=lambda x:-x[1])).keys())[:3]

top3({'Computer': 597, 'Cell Phones': 7176, 'Vacuum Cleaner': 3192, 'Autos': 597})

ただし、javascriptでは keyのみの指定だけではなく、indexも指定して 値が同じであればindexをもとに並び替えるという処理をしなければ、必ずは配列の元の順序が担保されない実装となっている。

function top3(products, prices) {
  let price = products.map((product, index) => {
	return {
		product: product,
		totalPrice: prices[index],
		originalIndex: index
    };
  });
  
  price.sort((a, b) => b.totalPrice - a.totalPrice || a.originalIndex - b.originalIndex);
  return price.slice(0, 3).map(item => item.product);
}


top3(["Computer", "Cell Phones", "Vacuum Cleaner", "Autos"], [40,40,40,40]);

そのため、originalIndex を keyとして保持しておき、それを 値が同じであれば並び替えの要素として使うという実装が必要である。

Discussion