時系列 list の圧縮
目的
時系列などで各時刻のラベルを出力すると,同一のラベルが並ぶことになる.重複を取り除くことによってラベル系列を見やすくする.
簡単に言うと,
['A', 'A', 'A', 'B', 'B', 'C', 'A', 'A', 'A', 'B', 'B']
を
['A', 'B', 'C', 'A', 'B']
にしたい.
python の基本機能で実現できる.
アルゴリズム
- リストを作成する
- 一つずらしたリストを作成する
- 比較して,一致していない要素でリストを作る
実験
初期設定
簡単にするために,文字列を list にする
item1 = list('AAABBCAAABB')
print('item1:', item1)
# item1: ['A', 'A', 'A', 'B', 'B', 'C', 'A', 'A', 'A', 'B', 'B']
一つずらしたリスト
- list の加算を使う
- list のスライスを使う
list は「加算: +
」 や 「乗算 *
」ができる.
list のスライスは基本なので覚えておくとよい.
['_']+item1[:-1]
とした.
item1[1:]+['_']
でもずらすことになる.
できた list は item1 と同じ長さ.
item2 = ['_']+item1[:-1]
print('item2:', item2)
# item2: ['_', 'A', 'A', 'A', 'B', 'B', 'C', 'A', 'A', 'A', 'B']
リストの比較
-
zip
を使いリストをまとめる. -
if
で要素を選択
zip では要素の数を合わせておいた方が良い.
item3 = [i for i,j in zip(item1, ['_']+item1[:-1]) if i != j]
print('item3:', item3)
# item3: ['A', 'B', 'C', 'A', 'B']
動作に対する補足実験 if
で何を比較しているか確認する.
item4 = [(i,j) for i,j in zip(item1, ['_']+item1[:-1])]
item5 = [(i,j) for i,j in zip(item1, ['_']+item1[:-1]) if i != j]
print('item4:', item4)
print('item5:', item5)
# item4: [('A', '_'), ('A', 'A'), ('A', 'A'), ('B', 'A'), ('B', 'B'), ('C', 'B'), ('A', 'C'), ('A', 'A'), ('A', 'A'), ('B', 'A'), ('B', 'B')]
# item5: [('A', '_'), ('B', 'A'), ('C', 'B'), ('A', 'C'), ('B', 'A')]
まとめ
list の加算,スライスにより比較するための list を作成した.
zip を使い,if で選択することで重複を取り除いた.
python の基本機能で実現できる.