okinawa

IT勉強メモ

座標圧縮

座標圧縮とは

値が何番目に小さいかをナンバリングする。

例えば、下記のX座標が何番目に小さいかを知りたい時に使う。
元の並び順を維持したままいける。

X = [8, 50, 33, 33, 33, 12, 1, 777]#1 4 3 3 3 2 0 5

ソースコード

重複を集合で除去 ➯ 連想配列に{key=圧縮前, value=圧縮後}を格納 ➯ 圧縮前配列をkeyにして、圧縮後連想配列を参照

#X座標の配列
X = [8, 50, 33, 33, 33, 12, 1, 777]

# 重複除去&ソート
B = sorted(set(X)) # [1, 8, 12, 33, 50, 777]

# 昇順で何番目かを連想配列のvalueに記録。key:圧縮前の座標 value:圧縮後の座標(何番目)
ranking = { before: i for i, before in enumerate(B) }
# {1: 0, 8: 1, 12: 2, 33: 3, 50: 4, 777: 5}

# 元の順番を維持したまま、座標圧縮
for Xi in X:
    print(ranking[Xi], end=" ") #1 4 3 3 3 2 0 5

例題

正に座標を圧縮する問題。

atcoder.jp

参考サイト

qiita.com