繁体   English   中英

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

[英]How can I implement vice versa mapping in Python?

我必须将一堆字符串转换成数字,处理数字然后转换回去。

我想到了一个地图,当我提供字符串时,我将在其中添加两个键:

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

但这在内存方面不是最佳的。

我需要在示例中存档的内容:

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

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

提前致谢!

您可以像这样实现自己的双向字典

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

您可以从值中获取密钥,而不是为第二个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)])

如果最佳内存使用是一个问题,那么您可能不希望一开始就使用Python。 要解决您的直接问题,只需将字符串和数字都添加为字典的键。 请记住,将仅存储对原始对象的引用。 不会制作其他副本:

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

现在,您可以按需要通过相反的键访问值。 该方法具有O(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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM