2017-02-07 64 views
-1

我必须将一串字符串转换为数字,处理数字并将其转换回来。如何在Python中反向映射?

我想到了一个地图,当我提供的字符串我将增加2项:

Key1: (string, number); 
Key2: (number, string). 

但是,这不是在内存方面优化。

我需要的例子中archieve:

my_cool_class.get('string') # outputs 1 
my_cool_class.get(1)  # outputs 'string' 

有没有更好的办法在Python做到这一点?

在此先感谢!

+0

什么是当前状态和什么是你需要的确切输出? –

+0

状态是真实的 - 现在就考虑问题。我确实需要:我需要一个可以映射字符串和数字的类,反之亦然。例如:my_cool_class.get('string') - > outputs 1; my_cool_class.get(1) - >输出“字符串” –

+0

喜@VladimirTsyshnatiy请用降价的提问 –

回答

1

而不是为第二个字典分配另一个内存,您可以从值中获得密钥,考虑它会花费你的运行时间。

mydict = {'george':16,'amber':19} 
print (mydict.keys()[mydict.values().index(16)]) 

>>> 'george' 

编辑:

注意,在Python 3,dict.values()(连同dict.keys()和dict.items())返回一个视图,而不是一个列表。因此,您需要在呼叫来包装你到dict.values()调用列出像这样:

mydict = {'george':16,'amber':19} 
print (list(mydict.keys())[list(mydict.values()).index(16)]) 
+0

真棒答案!谢谢! –

+0

类似的想法,但可能有点更清楚:'下一个((如果d [k] == x的k代表d,无)' –

2

您可以实现像

class TwoWayDict(dict): 
    def __len__(self): 
     return dict.__len__(self)/2 

    def __setitem__(self, key, value): 
     dict.__setitem__(self, key, value) 
     dict.__setitem__(self, value, key) 

my_cool_class = TwoWayDict() 
my_cool_class[1] = 'string' 
print my_cool_class[1] # 'string' 
print my_cool_class['string'] # 1 
+0

是的,我想加入(key,value)和(value,key) ,但这会消耗额外的内存,所以我决定问你们如何避免这种情况。 –

+0

这取决于什么对您更为重要:内存消耗或搜索复杂性。 –

+0

你说得对,我认为记忆现在更重要。但感谢您的帮助!如果我改变了我的视野,我一定会使用你的代码。 –

1

自己的双向字典如果优化内存使用是一个问题,你可能不想首先使用Python。要解决您的直接问题,只需将字符串和数字作为键添加到字典中。请记住只存储对原始对象的引用。额外的副本将不能进行:

d = {} 
s = '123' 
n = int(s) 
d[s] = n 
d[n] = s 

现在你可以就像你想要相反的键访问值。该方法的优点是查找时间为O(1)

+0

如果它们真的是复制品,那么Nils Werner的答案也适用。非常感谢你! –

+0

@VladimirTsyshnatiy。绝对。他的方法就像这样,除了他在一次操作中添加了两个键。 –

1

您可以通过这种方式创建一个元组字典,您只需要根据变量的类型进行检查以确定应该返回哪个元组。 例如:

class your_cool_class(object): 

    def __init__(self): 
     # example of dictionary 
     self.your_dictionary = {'3': ('3', 3), '4': ('4', 4)} 

    def get(self, numer): 
     is_string = isinstanceof(number, str) 
     number = str(number) 
     n = self.your_dictionary.get(number) 
     if n is not None: 
      return n[0] if is_string else n[1] 


>>>> my_cool_class = your_cool_class() 
>>>> my_cool_class.get(3) 
>>>> '3' 
>>>> my_cool_class.get('3') 
>>>> 3