0

这可能是一个愚蠢的问题,但由于某种原因,解决方案目前让我无法理解。

我想快速有效地访问列表格式的数据。例如,问题列表:

q = {}
q[1] = "my first string"
q[2] = "my second string"
q[3] = "my third string"

我可以通过执行 q[2] 轻松找到问题 2 的字符串。但我也想通过用字符串索引 q 来检索问题编号:

q["my second string"] -> gives 2 as answer

我想在不迭代键的情况下执行此操作(违背字典的目的),并且希望避免使用字符串作为键来定义第二个字典以避免浪费内存。这可能吗?

最终原因是我想访问 q[2] 或 q["my second string"] 并获取与问题 2 关联的数据,无论是使用数字还是字符串作为该数据的键。在避免数据重复的同时不必遍历所有键,这是否可能?

4

4 回答 4

2

int混合使用和str作为键没有问题

>>> q = {}
>>> q[1] = "my first string"
>>> q[2] = "my second string"
>>> q[3] = "my third string"
>>> q.update({v:k for k,v in q.items()})
>>> q["my second string"]
2
于 2012-06-28T07:30:48.617 回答
1

您可以使用OrderedDict,但对于其中一个方向,它不会像普通字典查找那样有效。

from collections import OrderedDict
q = OrderedDict()
q["my first string"] = 1
q["my second string"] = 2
q["my third string"] = 3
# Now you have normal key lookups on your string as a normal dict, and to get the order
q.values()[1]  # To get the second value out
# To get the key, value pair of the second entry
q.items()[1]
# Would return `('my second string', 2)`
于 2012-06-28T07:24:36.260 回答
0

这是在 Python 中的高效双向哈希表中提出的?

答案保持不变 -bidict使用http://pypi.python.org/pypi/bidict

于 2012-06-28T07:38:30.383 回答
0
class MyDict(dict):
    def __init__(self, **kwargs):
        super(MyDict, self).__init__(**kwargs)
        for k, v in kwargs.iteritems():
            self[v] = k
    def __setitem__(self, key, val):
        super(MyDict, self).__setitem__(key, val)
        super(MyDict, self).__setitem__(val, key)

d = MyDict(a=1, b=2)
print d[1] # "a"
print d[2] # "b"
d['c'] = 3
print d[3] # "c"
于 2012-06-28T07:39:56.487 回答