2012-10-17 148 views
1

我有20個匹配20個整數的字符串。所有整數和字符串都是唯一。我正在考慮但希望避免創建兩本字典。一個字典將被字符串索引,並且一個字典將被整數索引。Python處理反向查找

  • 我應該如何處理這種情況?

我創建了兩個列表。一個包含字符串,另一個包含整數。我正在考慮建立兩個功能。一個函數會產生一個字符串。另一個函數將產生一個整數。另一種選擇是如果生成的參數是整數或字符串,則通過分支將這些組合成一個函數。

  • 這是怎麼比得上一本字典?它會消耗大量的CPU嗎? (此功能將運行百萬次每天)
  • 我應該是製造一種元組(字符串,整數)的列表,然後 創建兩本字典,一個映射的int列表中的位置和其他 字符串列表位置?會不會是最好的方式?

我沒有很多的項目,我可以犧牲一些內存。

請爲什麼它是最好的解釋說明的最佳方法。

謝謝。

+0

什麼是您反對有兩個詞典?只要你從另一個自動生成一個,而不是獨立地定義它們,它似乎是最直接的解決方案。 –

+0

@MarkReed,聽起來有點不對。我是Python的新手,我認爲創建一個實際上可以反向查找字典的實體會更好。就這樣。你認爲這樣嗎? – Phil

回答

3

沒問題,你應該環繞它的一類,當你更新一個自動更新的另一個方向。例如,下面是使用@ mgilson技術的基本雙向字典的開始(這意味着,如果您正在映射到彼此之間的兩組項目之間有任何重疊,則不會工作;不過,具有不同類型的工作很好):

class BiDict(dict): 
    """Bidirectional Dictionary - setting 'key' to 'value' also 
    sets 'value' to 'key' (so don't use overlapping mappings) 
    """ 

    def __init__(self, *args): 
    super(BiDict, self).__init__(*args) 

    # After regular dict initialization, loop over any items 
    # and add their reverse. Note that we can't use any of the 
    # iter* methods here since we're adding items in the body 
    # of the loop. 
    for key in self.keys(): 
     super(BiDict, self).__setitem__(self[key], key); 


    def __setitem__(self, key, val): 
    # If the key has an old value, delete its reverse 
    if key in self: 
     super(BiDict, self).__delitem__(self[key]) 

    # Then add both forward and reverse for the new value 
    super(BiDict, self).__setitem__(key, val); 
    super(BiDict, self).__setitem__(val, key); 

    def __delitem__(self, key): 
    # delete both directions 
    if key in self: 
     super(BiDict, self).__delitem__(self[key]); 
     super(BiDict, self).__delitem__(key); 

您可以使用它像這樣:

>>> from bidict import BiDict 
>>> d = BiDict({'a':1,'b':2}) 
>>> d['a'] 
1 
>>> d[2] 
'b' 
>>> d['c']=3 
>>> d[3] 
'c' 
>>> del d['a'] 
>>> d['a'] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
KeyError: 'a' 
>>> d[1] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
KeyError: 1 
+0

非常感謝您的時間和努力。我會走這樣的。 – Phil

4

爲什麼不使用1個字典來進行映射?

ints = list(range(10)) 
strs = [str(x) for x in ints] 
d = dict(zip(ints,strs)) 
d.update(zip(strs,ints)) 

print repr(d[1]) # '1' 
print repr(d['1']) # 1 

既然你有獨特的字符串和獨特的整數,那麼這兩個集合的並集也應該是一個獨特的列表,它包含了所有其他兩個的元素。應該有拿着他們無論是在你去什麼解決方案,如果你希望它是強大的字典

+0

嗨@mgilson!我想到了,正如我在我的問題中所說的那樣,但正如我上面對@MarkReed所解釋的那樣,它似乎不是一個反向查找的優雅解決方案。你認爲這是正確的做法嗎? – Phil

+0

@菲爾 - 我不認爲有什麼*錯誤*。我認爲實際的解決方案可能很大程度上取決於您實際計劃使用此映射做什麼。與在列表中使用'.index'相比,這將在計算上更有效率。 – mgilson

+0

非常感謝mgilson! – Phil