【问题标题】:How can I use both a key and an index for the same dictionary value?如何对同一个字典值同时使用键和索引?
【发布时间】:2011-05-28 23:22:11
【问题描述】:

我需要一个数据数组,它有一个数字索引,但也有一个人类可读的索引。我需要后者,因为数字索引将来可能会发生变化,并且我需要将数字索引作为固定长度套接字消息的一部分。

我的想象暗示了这样的事情:

ACTIONS = {
    (0, "ALIVE") : (1, 4, False),
    (2, "DEAD") : (2, 1, True)
}

>ACTIONS[0]
(1, 4, False)
>ACTIONS["DEAD"]
(2, 1, True)

【问题讨论】:

  • 真棒的问题!我建议您将问题的标题更改为“每个字典值的多个键”,以帮助其他想知道相同问题的人找到此问题。
  • 接受的答案与问题的标题不匹配(尽管它适合这个问题)...
  • 他可以通过键和数字索引访问字典中的值——这几乎就是我所追求的。我应该改标题
  • @d.putto: 我改了标题 - 如果你觉得它可以更好,请编辑它
  • @Codemonkey 我创建了另一个标题为“multiple-keys-per-value”的问题stackoverflow.com/questions/11449232/multiple-keys-per-value 请编辑我的问题以使其更符合主题。谢谢

标签: python python-2.7


【解决方案1】:

实现这一点的最简单方法是拥有 两个 字典:一个将索引映射到您的值,另一个将字符串键映射到相同的对象:

>> actions = {"alive": (1, 4, False), "dead": (2, 1, True)}
>> indexed_actions = {0: actions["alive"], 2: actions["dead"]}
>> actions["alive"]
(1, 4, False)
>> indexed_actions[0]
(1, 4, False)

【讨论】:

  • 不过,这有一点问题:如果将其中一个键更改为新值,则 indexed_actions 和操作不会保持同步,即使 actions["alive"] 是 indexed_actions[ 0]。
  • 我有类似的问题,我正在使用这种方法。有没有其他办法?
【解决方案2】:

使用 Python 2.7 的 collections.OrderedDict

In [23]: d = collections.OrderedDict([
   ....:   ("ALIVE", (1, 4, False)),
   ....:   ("DEAD", (2, 1, True)),
   ....: ])

In [25]: d["ALIVE"]
Out[25]: (1, 4, False)

In [26]: d.values()[0]
Out[26]: (1, 4, False)

In [27]: d.values()[1]
Out[27]: (2, 1, True)

【讨论】:

  • 这是一个很好的解决方案!起初我以为OrderedDict 是指自动排序的字典,而不是让我决定顺序的字典。无论如何,谢谢:-)
【解决方案3】:

如果您想为代码的可读性命名密钥,您可以执行以下操作:

ONE, TWO, THREE  = 1, 2, 3

ACTIONS = {
    ONE : value1,
    TWO : value2
}

【讨论】:

  • 问题是让ACTIONS[DEAD]之类的东西成为可能。
【解决方案4】:

命名元组很好:

>>> import collections
>>> MyTuple = collections.namedtuple('MyTuple', ('x','y','z'))
>>> t = MyTuple(1,2,3)
>>> t
MyTuple(x=1, y=2, z=3)
>>> t[0]
1
>>> t.x
1
>>> t.y
2

【讨论】:

  • 我想我明白你在说什么,但一开始我没有。你应该把它拼出来;如果你这样做,一个赞成票正在等着你。如果 OP 不需要 strings,而只需要一种人类可读的方式来表示数字键值,那么这是 IMO 的绝佳解决方案。
  • OP 并没有真正要求字符串表示...无论如何,他也可以做​​到 t._asdict()['x'] 并实现这一目标
猜你喜欢
  • 1970-01-01
  • 2018-03-15
  • 1970-01-01
  • 2019-08-19
  • 2021-05-30
  • 2014-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多