LoginSignup
0
2

More than 1 year has passed since last update.

[AtCoder]双方向辞書

Last updated at Posted at 2022-05-01

双方向からアクセスできる辞書

辞書の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]となります。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2