У класса есть конструктор, который принимает один параметр:
class C(object):
def __init__(self, v):
self.v = v
...
Где-то в коде для значений в dict полезно знать их ключи.
Я хочу использовать defaultdict с ключом, переданным новым значениям по умолчанию:
d = defaultdict(lambda : C(here_i_wish_the_key_to_be))
Какие-либо предложения?
python
dictionary
defaultdict
Бенджамин Нитлехоо
источник
источник
defaultdict
«s__missing__()
метод может быть переопределен (как это может в любой подкласс встроенногоdict
класса , начиная с версии 2.5).Нет, нет.
defaultdict
Реализация не может быть сконфигурирована для передачи отсутствуетkey
вdefault_factory
вне коробки. Ваш единственный вариант - реализовать свой собственныйdefaultdict
подкласс, как это было предложено @JochenRitzel выше.Но это не «умно» или почти так чисто, как было бы стандартное библиотечное решение (если бы оно существовало). Таким образом, ответ на ваш лаконичный вопрос «да / нет» будет однозначно «Нет».
Жаль, что в стандартной библиотеке отсутствует столь часто используемый инструмент.
источник
Я не думаю, что тебе
defaultdict
здесь вообще нужно . Почему бы просто не использоватьdict.setdefault
метод?>>> d = {} >>> d.setdefault('p', C('p')).v 'p'
Это, конечно, создаст много экземпляров
C
. Если это проблема, я думаю, подойдет более простой подход:>>> d = {} >>> if 'e' not in d: d['e'] = C('e')
defaultdict
Насколько я понимаю, это будет быстрее, чем любая другая альтернатива.ETA относительно скорости
in
теста по сравнению с использованием предложения try-except:>>> def g(): d = {} if 'a' in d: return d['a'] >>> timeit.timeit(g) 0.19638929363557622 >>> def f(): d = {} try: return d['a'] except KeyError: return >>> timeit.timeit(f) 0.6167065411074759 >>> def k(): d = {'a': 2} if 'a' in d: return d['a'] >>> timeit.timeit(k) 0.30074866358404506 >>> def p(): d = {'a': 2} try: return d['a'] except KeyError: return >>> timeit.timeit(p) 0.28588609450770264
источник
d[key]
чтобы вернутьd[key] = C(key)
ifkey not in d
. Но ваше решение требует, чтобы он на самом деле ехал и заранее настраивалd[key]
? Как он узнал, чтоkey
ему нужно?Вот рабочий пример словаря, который автоматически добавляет значение. Демонстрационная задача по поиску повторяющихся файлов в / usr / include. Обратите внимание, что для настройки словаря PathDict требуется всего четыре строки:
class FullPaths: def __init__(self,filename): self.filename = filename self.paths = set() def record_path(self,path): self.paths.add(path) class PathDict(dict): def __missing__(self, key): ret = self[key] = FullPaths(key) return ret if __name__ == "__main__": pathdict = PathDict() for root, _, files in os.walk('/usr/include'): for f in files: path = os.path.join(root,f) pathdict[f].record_path(path) for fullpath in pathdict.values(): if len(fullpath.paths) > 1: print("{} located in {}".format(fullpath.filename,','.join(fullpath.paths)))
источник