双方向からアクセスできる辞書
辞書のvalueの検索は計算量がNかかるため、valueからも計算量1でアクセスできる辞書を作成しました。
使用は自由ですが、自分用なのでコードが汚いです。
実行環境
Pypy3(7.3.0)
コード
class WD():
#keyからvalueもvalueからkeyも計算量1で
#アクセスできる辞書
#例 key:リンゴ,value:apple
def __init__(self):
self.Dict1 = {}
self.Dict2 = {}
def print(self):
print("D1",self.Dict1)
print("D2",self.Dict2)
def set(self,value1,value2):
#keyとvalueを入力(set(リンゴ,apple))
self.Dict1[value1] = value2
self.Dict2[value2] = value1
def retvalue1(self,value1):
#keyを入力するとvalue変換(retvalue1(リンゴ)→apple)
return self.Dict1[value1]
def retvalue2(self,value2):
#valueを入力するとkey変換
return self.Dict2[value2]
def changevalue1(self,changed_value1,value2):
#keyの方を変更したい時に、valueをもとに変更
del self.Dict1[self.Dict2[value2]]
self.Dict1[changed_value1] = value2
self.Dict2[value2] = changed_value1
def changevalue2(self,value1,changed_value2):
#valueを変更したい時に、keyをもとに変更
del self.Dict2[self.Dict1[value1]]
self.Dict2[changed_value2] = value1
self.Dict1[value1] = changed_value2
def shiftvalue1(self,value1_1,value1_2):
self.Dict2[self.Dict1[value1_1]],self.Dict2[self.Dict1[value1_2]] = self.Dict2[self.Dict1[value1_2]],self.Dict2[self.Dict1[value1_1]]
self.Dict1[value1_1],self.Dict1[value1_2] = self.Dict1[value1_2],self.Dict1[value1_1]
def shiftvalue2(self,value2_1,value2_2):
self.Dict1[self.Dict2[value2_1]],self.Dict1[self.Dict2[value2_2]] = self.Dict1[self.Dict2[value2_2]],self.Dict1[self.Dict2[value2_1]]
self.Dict2[value2_1],self.Dict2[value2_2] = self.Dict2[value2_2],self.Dict2[value2_1]
使用例1
wd = WD()
wd.set("リンゴ","apple")
wd.set("みかん","orange")
wd.print()
#D1 {'リンゴ': 'apple', 'みかん': 'orange'}
#D2 {'apple': 'リンゴ', 'orange': 'みかん'}
print(wd.retvalue1("リンゴ"))
#apple
print(wd.retvalue2("orange"))
#みかん
wd.changevalue1("りんご","apple")
wd.changevalue2("みかん","Orange")
wd.print()
#D1 {'みかん': 'Orange', 'りんご': 'apple'}
D2 {'apple': 'りんご', 'Orange': 'みかん'}
一つのkeyに対し、一つのvalueが入ることを前提としています。
同様に一つのvalueに対し一つのkeyとなることを前提としています。
使用例2
wd = WD()
wd.set(1,2)
wd.set(2,3)
wd.set(3,1)
wd.set(4,4)
wd.print()
#D1 {1: 2, 2: 3, 3: 1, 4: 4}
#D2 {2: 1, 3: 2, 1: 3, 4: 4}
[2,3,1,4]
のように、配列の場所と値のどちらからでもアクセスできるので便利です。
このとき、
D1は配列の値をkey、場所をvalueとします。
D2は配列の場所をvalue、値をkeyとします。
shiftvalue1
wd.shiftvalue1(1,2)
wd.print()
#D1 {1: 3, 2: 2, 3: 1, 4: 4}
#D2 {2: 2, 3: 1, 1: 3, 4: 4}
shiftvalue1を使うと、場所を参照し値を入れ替えます。
例としてwd.shiftvalue1(1,2)は1番目と2番目の値を入れ替えるため、
[3,2,1,4]となります。
shiftvalue2
shiftvalue1を行う前の状態から実行します。
wd.shiftvalue2(1,2)
wd.print()
#D1 {1: 1, 2: 3, 3: 2, 4: 4}
#D2 {2: 3, 3: 2, 1: 1, 4: 4}
wd.shiftvalue2(1,2)は、1と2の値の位置を入れ替えるため、
[1,2,3,4]となります。