2012-05-31 2 views
0

Я знаю, что его легко реализовать.Список словарей: get() schould loop over list

Я хочу словарь типа class, который принимает список словарей в конструкторе.

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

Этот словарьский контейнер следует читать только для моего использования.

+0

Что делать, если этот класс словаря внутренне объединяет этот словарь в 1 словарь? –

+0

Новый словарь должен содержать только список dicts. Данные не должны копироваться. – guettli

ответ

3

Вы, кажется, описываете collections.ChainMap, который будет в следующей версии Python (3.3, ожидается в конце в конце этого года). Для текущих/более ранних версий Python вы можете скопировать реализацию с collections source code.

+2

Через несколько секунд после запроса я нашел решение в django: MergeDict: https://github.com/django/django/blob/master/django/utils/datastructures.py Приятно знать, что ChainMap будет в Python в будущее. – guettli

0

Не совсем ответьте на вопрос: что, если вы просто определяете метод, который объединяет все словари в один? Зачем создавать для него новый класс?
Как слить: How to merge two Python dictionaries in a single expression?
переменные аргументы: Can a variable number of arguments be passed to a function?

+1

Если это не совсем ответ, тогда вы должны поставить это как комментарий к вопросу, а не как ответ! –

+0

Ну, это не прямой ответ, но он делает нужную задачу и, с моей точки зрения, делает ее лучше, чем дополнительный класс. – popfalushi

0

Вы можете легко это реализовать с этой логикой.

  1. Итерации по всем словарям в списке.
  2. Для каждого словаря, посмотрите, есть ли у него необходимый ключ, используя оператор key in value.
  3. Если значение найдено, верните значение из функции.
  4. Если вы выполнили итерацию по всем словарям, а значение не найдено, исключение Raise KeyError.