Как я могу использовать как ключ, так и индекс для одного значения словаря?

136
10

Мне нужен массив данных с числовым индексом, но также читаемый человеком индекс. Мне нужно последнее, потому что числовые индексы могут измениться в будущем, и мне нужны числовые индексы как часть сообщения сокета фиксированной длины.


Мое воображение предлагает что-то вроде этого:


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

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

спросил(а) 2011-05-29T02:22:00+04:00 9 лет, 6 месяцев назад
1
Решение
109

Использовать коллекции Python 2.7.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)

ответил(а) 2011-05-29T02:41:00+04:00 9 лет, 6 месяцев назад
115

Самый простой способ добиться этого - иметь два словаря: одно отображение индексов в ваши значения и одно сопоставление строковых ключей с теми же объектами:

>> 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)

ответил(а) 2011-05-29T02:27:00+04:00 9 лет, 6 месяцев назад
59

Namedtuples хороши:


>>> 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

ответил(а) 2011-05-29T03:31:00+04:00 9 лет, 6 месяцев назад
59

Если вы хотите назвать свои ключи для чтения кода, вы можете сделать следующее:


ONE, TWO, THREE  = 1, 2, 3

ACTIONS = {
ONE : value1,
TWO : value2
}

ответил(а) 2011-05-29T02:28:00+04:00 9 лет, 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема