2016-10-16 11 views
0

真の条件は次のように見える場合の最善の方法は、辞書の値と一致しますPython。私は今、自分のコードの一部であるパー​​サを構築しようとしている

azeri_nums  = {k:v for k,v in zip(range(1,10),("bir","iki","uc","dord","beş","altı","yeddi","səkkiz","doqquz"))} 
russian_nums = {k:v for k,v in zip(range(1,10),("один","два","три","четыре","пять","шесть","семь","восемь","девять"))} 

を私は数字を見つける必要があることを想像している場合roomnum =「одна」 ここで私はこれと一致しようとしている方法です:

if roomnum.isalpha(): 
    for key,value in azeri_nums.items(): 
     if value.startswith(roomnum.lower()): 
      roomnum = str(key) 
      break 

if roomnum.isalpha(): 
    for key,value in russian_nums.items(): 
     if value.startswith(roomnum.lower()): 
      roomnum = str(key) 
      break 

はそれがより速く動作することを行うには、他の方法、またはこのような状況のためのいくつかのベストプラクティスはありますか?

ありがとうございます!

P.S. このコードがモジュール "re"を "одна"から "од"だけキャプチャして動作する理由は、 "один" .startswith( "од")がtrueを返す理由です。

+1

あなたの辞書が他の方法で回避int型に文字列をマップではなく、持っている必要がありますように見えます。 –

+0

あなたの現在のコードは機能しますか? roomnum = "одна"なら ''один ".startswith(roomnum.lower())'は真ではありません。 –

+0

ところで、これらのdictsを構築するためのより良い方法があります。たとえば、 'dict(列挙する(列挙する("ддрен "、"два "、"три "、"четыре "、"пять "、"шесть "、"семь "、"восемь " 、 "девять")、1)) '。しかし、Christofer Ohlsson&Nf4rが言っているように、あなたはおそらくあなたのキーと値を入れ替えるべきでしょう。例えば、 '{k:v for、enumerate(" "диа"、 "три"、 "четыре"、 "пять "、"шесть "、"семь "、"восемь "、"девять ")、1)}' –

答えて

1

azeri_nums = {v.lower():k for k,v in zip(range(1,10),("bir","iki","uc","dord","beş","altı","yeddi","səkkiz","doqquz"))} 
russian_nums = {v.lower():k for k,v in zip(range(1,10),("один","два","три","четыре","пять","шесть","семь","восемь","девять"))} 

そして、あなたは数字にマッピングされた名前は、ちょうど使用したらであるためにあなたのdictを変更

key = None # By default 
roomnum_lower = roomnum.lower() 
if roomnum_lower in azeri_nums: 
    key = azeri_nums[roomnum_lower] 
elif roomnum_lower in russian_nums: 
    key = russian_nums[roomnum_lower] 

辞書はvaluesearch、keysearchないに基づいています。最初のものはO(1)であり、2番目のものがO(n)でありループが必要な場合は、key in dictを使用することができます。

EDITはコメントに:

をあなたがそれを処理する別の辞書を作成し、他の人に一つの単語をマップする場合。

string_map = {'одна': ['один',]} # map single string to many others if u want 

そしてuが行う必要があるすべては次のとおりです。

key = None # By default 
roomnum_lower = roomnum.lower() 
if roomnum_lower in azeri_nums: 
    key = azeri_nums[roomnum_lower] 
elif roomnum_lower in russian_nums: 
    key = russian_nums[roomnum_lower] 
if key is None: 
    # At this point you know that the single string is not in any dict, 
    # so u start to check if any other string that u assigned to it is in dict 
    for optional_string in string_map.get(roomnum_lower, []): 
     opt_str_low = optional_string.lower() 
     key = azeri_nums.get(opt_str_low, None) 
     key = russian_nums.get(opt_str_low, None) if key is None else key 
+0

ありがとう、私はなぜ使用した理由を指定する必要がありますか.startswith: –

+0

値はいくつかの方法で形成することができます。例えば、 –

+0

"одна"は "один"にマップする必要があります。 ?複数のコメントを残念にごBTW。それは私の最初の時間です。 –

関連する問題