Эффективно изменить ключ Python dict - PullRequest
5 голосов
/ 20 августа 2011

Я собираюсь заменить ключи dict на более короткие варианты, чтобы их можно было передавать по проводам в компактной форме. Есть ли способ обновить ключ вместо создания нового элемента в dict и удаления старого?

Что я сейчас делаю:

>>> a = dict(long_key=None)
>>> a['l'] = a['long_key']
>>> del a['long_key']

Я бы хотел сделать что-то вроде этого:

>>> a = dict(long_key=None)
>>> a.update_key('long_key', 'l')

Я не уверен во внутренних органах dict. Однако, похоже, что-то вроде update_key может помочь избежать удаления старого ключа.

Ответы [ 4 ]

3 голосов
/ 20 августа 2011

Это преждевременная оптимизация. Если вы действительно хотите сэкономить пропускную способность, сделайте это либо сжимая данные обычно , либо используя более простые структуры данных.

3 голосов
/ 20 августа 2011

Более элегантным решением может быть создание нового словаря ... по сути, сделайте слегка отличную мелкую копию:

a_send = dict((k[0], v) for k,v in a.items())

Это, безусловно, будет менее экономичным - вы ищете местоэффективность, экономия времени или элегантность кода?

1 голос
/ 20 августа 2011

Сколько раз вам нужно отправить его? Может быть, вместо того, чтобы что-то менять, вы можете просто обрабатывать ключи по ходу дела?

Вместо того, чтобы делать что-то вроде (угадывание псевдокода):

short_dict = shorten_keys(long_dict)
for k,v in short_dict:
    send_over(k,v)

сделать что-то вроде:

for k,v in long_dict:
    send_over(shorten(k),v)

Если вам нужно отправить его много раз, вы также можете создать карту длинных -> коротких клавиш и использовать ее при отправке. Потеря пространства / времени для создания копий может быть не лучшим решением.

0 голосов
/ 20 августа 2011
longer = dict(long_key=None)
mapping = dict(long_key='l')
shorter = dict((mapping[k], v) for k,v in longer.iteritems())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...