Как сделать списки автоматически созданными при использовании в Python, как в Perl? - PullRequest
4 голосов
/ 28 апреля 2010

В Perl я могу сделать это:

push(@{$h->[x]}, y);

Можно ли упростить следующие коды Python в соответствии с приведенным выше примером Perl?

if x not in h:
  h[x] = []
h[x].append(y)

Я хочу упростить это, потому что в моем коде много раз (и я не могу инициализировать все возможные x с помощью []). Я не хочу делать это функцией, потому что нет ключевого слова inline.

Есть идеи?

Ответы [ 3 ]

9 голосов
/ 28 апреля 2010

Очень элегантный способ (начиная с Python 2.5) - использовать defaultdict из модуля "коллекций":

>>> from collections import defaultdict
>>> h = defaultdict(list)
>>> h['a'].append('b')
>>> h
defaultdict(<type 'list'>, {'a': ['b']})

defaultdict походит на dict, но предоставляет значение по умолчанию, используя любой конструктор, который вы передали ему, когда создавали его (в данном примере, список).

Мне особенно это нравится в методе setdefault dict, потому что 1) вы определяете переменную как defaultdict, и, как правило, никаких других изменений в коде не требуется (за исключением, возможно, удаления предыдущих ключей для значений по умолчанию); и 2) setdefault - ужасное имя: P

4 голосов
/ 28 апреля 2010

Есть несколько способов сделать это с помощью dict методов :

h.setdefault(x, []).append(y)

или

h[x] = h.pop(x,[]).append(y)
3 голосов
/ 28 апреля 2010

Вы можете использовать setdefault

h = {}
h.setdefault(x, []).append(y)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...