我必须将一堆字符串转换为数字,处理数字并转换回来。
我想到了一张地图,当我提供字符串时,我会添加2个键:
Key1: (string, number);
Key2: (number, string).
但就记忆而言,这并不是最佳的。
我需要在示例中实现的目标:
my_cool_class.get('string') # outputs 1
my_cool_class.get(1) # outputs 'string'
在python中有更好的方法吗?
提前致谢!
答案 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