如何在Python中实现反之亦然映射?

时间:2017-02-07 11:34:45

标签: python

我必须将一堆字符串转换为数字,处理数字并转换回来。

我想到了一张地图,当我提供字符串时,我会添加2个键:

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

但就记忆而言,这并不是最佳的。

我需要在示例中实现的目标:

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

在python中有更好的方法吗?

提前致谢!

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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)])

答案 2 :(得分:1)

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

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

现在您可以按照您想要的方式通过相反的键访问该值。此方法具有O(1)查找时间的优点。

答案 3 :(得分: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