Что эквивалентно map <int, vector <int>> в Python? - PullRequest
9 голосов
/ 28 ноября 2008

В C ++ часто делают что-то вроде этого:

typedef map<int, vector<int> > MyIndexType;

Где я тогда использую это так:

MyIndexType myIndex;
for( ... some loop ...)
{
  myIndex[someId].push_back(someVal);
}

Если на карте не было записи, код вставит новый пустой вектор, а затем добавит к нему.

В Python это будет выглядеть так:

myIndex = {}

for (someId,someVal) in collection:
   try:
      myIndex[someId].append(someVal)
   except KeyError:
      myIndex[someId] = [someVal]

Попытка кроме здесь немного уродлива. Есть ли способ сообщить словарю тип объекта для вставки при обнаружении ключевой ошибки во время объявления словаря?

Ответы [ 5 ]

15 голосов
/ 28 ноября 2008

Вы хотите использовать:

from collections import defaultdict
myIndex = defaultdict(list)
myIndex[someId].append(someVal)

Стандартная библиотека defaultdict объекты .

Пример использования из документации Python:

>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> d = defaultdict(list)
>>> for k, v in s:
        d[k].append(v)

>>> d.items()
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
10 голосов
/ 28 ноября 2008

Что-то вроде этого возможно:

myIndex = {}
for (someId,someVal) in collection:
    myIndex.setdefault(someId, []).append(someVal)
2 голосов
/ 28 ноября 2008

Просто чтобы завершить ответ Аластера: Существует также get эквивалент setdefault , который называется get (а не getdefault, как можно подумать):

myIndex = {}
someId = None
myList = myIndex.get(someId, []) # myList is [] now
1 голос
/ 28 ноября 2008

Начиная с Python 2.5, вы можете получить поведение setdefault или использовать defaultdict, внедрив

__missing__(k)

как в примечании 10 здесь .

0 голосов
/ 28 ноября 2008

Как насчет этого? Возможно, это не оптимально для производительности, но я думаю, что это «самая простая вещь, которая могла бы работать».

myIndex = {}

for (someId,someVal) in collection:
   if someId not in myIndex:
       myIndex[someId] = []
   myIndex[someId].append(someVal)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...