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

如何在Python中实现反之亦然的映射?,python,Python,我必须把一串字符串转换成数字,处理这些数字,然后再转换回来 我想到了一个地图,当我提供了字符串时,我会在其中添加两个键: Key1: (string, number); Key2: (number, string). 但就记忆而言,这并不是最优的 我需要在示例中归档的内容: my_cool_class.get('string') # outputs 1 my_cool_class.get(1) # outputs 'string' 在python中有更好的方法来实现这一点吗

我必须把一串字符串转换成数字,处理这些数字,然后再转换回来

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

Key1: (string, number); 
Key2: (number, string).
但就记忆而言,这并不是最优的

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

my_cool_class.get('string') # outputs 1
my_cool_class.get(1)        # outputs 'string'
在python中有更好的方法来实现这一点吗


提前谢谢

< P>而不是为第二个DIT分配另一个内存,可以从值中获取密钥,认为它会花费您运行时。
mydict = {'george':16,'amber':19}
print (mydict.keys()[mydict.values().index(16)])

>>> 'george'
编辑:

注意,在Python3中,dict.values()以及dict.keys()和dict.items()返回一个视图,而不是列表。因此,您需要将对dict.values()的调用封装在对列表的调用中,如下所示:

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

您可以实现自己的双向dict-like

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

如果最佳内存使用是一个问题,那么您可能首先不想使用Python。要解决眼前的问题,只需将字符串和数字作为键添加到字典中即可。请记住,仅存储对原始对象的引用。在下列情况下,将不制作其他副本:

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

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

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


当前状态是什么?您需要的确切输出是什么?状态是实际的-现在思考问题。我真正需要的是:我需要一个可以映射字符串和数字的类,反之亦然。示例:my_cool_class.get('string')->输出1;我的课程很酷。获取(1)->输出'string'hi@VladimirTsyshnatiy请使用降价来回答您的问题!谢谢类似的想法,但可能更清楚一点:
下一步((如果d[k]==x,则k代表d中的k),无)
是的,我考虑过添加(key,value)和(value,key),但这会消耗额外的内存,所以我决定问你们如何避免这种情况。这取决于对你们来说更重要的是:内存消耗还是搜索复杂性。你们是对的,我认为记忆现在更重要了。但是谢谢你的帮助!如果我改变我的愿景,我肯定会使用你的代码。这是确保映射保持唯一性(双向)的一种方法。如果只重载
\uuuu getitem\uuuu
方法,则可以创建已存储为值的键,从而破坏dict的双向性质。此实现的一个问题是,如果按以下方式构造dict,
d=TwoWayDict({'a':0,'b':1,'c':2})
。不会创建映射,因为不会调用
\uuuuu setitem\uuuuu
。如果它们确实是副本,那么Nils-Werner的答案也会起作用。非常感谢你@弗拉基米尔·西纳蒂。绝对地他的方法与此完全相同,只是他在一个操作中添加了两个键。
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