KeyError при использовании скрипта «devnagri» (хинди) для ключа при создании словаря [дубликат]

Набор точек без каких-либо других ограничений не обязательно однозначно определяет многоугольник.

Итак, сначала вам нужно решить, какой полигон построить из этих точек - возможно, выпуклый корпус? http://en.wikipedia.org/wiki/Convex_hull

Затем триангулируем и вычисляем область. http://www.mathopenref.com/polygonirregulararea.html

124
задан Morlock 8 April 2010 в 15:37
поделиться

2 ответа

Использование:

d = defaultdict(lambda: defaultdict(int))

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

259
ответ дан interjay 19 August 2018 в 10:15
поделиться
  • 1
    Только проблема заключается в том, что он не будет мариновать, то есть multiprocessing недоволен отправкой их туда и обратно. – Noah 27 March 2012 в 17:49
  • 2
    @Noah: он будет мариновать, если вы используете именованную функцию уровня модуля вместо лямбда. – interjay 27 March 2012 в 18:28
  • 3
    @ScienceFriction Что-нибудь конкретное, что вам нужна помощь? Когда доступ к d[new_key], он вызовет лямбду, которая создаст новый defaultdict(int). И когда доступ к d[existing_key][new_key2], будет создан новый int. – interjay 11 October 2013 в 13:53
  • 4
    Это круто. Кажется, я ежедневно обновляю свои брачные обещания на Python. – mVChr 3 November 2014 в 23:32
  • 5
    Ищете более подробную информацию об использовании этого метода с multiprocessing и о том, что называется функцией уровня модуля? Этот вопрос следует за ним. – Cecilia 15 April 2015 в 17:03

Посмотрите на ответ nosklo здесь для более общего решения.

class AutoVivification(dict):
    """Implementation of perl's autovivification feature."""
    def __getitem__(self, item):
        try:
            return dict.__getitem__(self, item)
        except KeyError:
            value = self[item] = type(self)()
            return value

Тестирование:

a = AutoVivification()

a[1][2][3] = 4
a[1][3][3] = 5
a[1][2]['test'] = 6

print a

Выход:

{1: {2: {'test': 6, 3: 4}, 3: {3: 5}}}
9
ответ дан Community 19 August 2018 в 10:15
поделиться
  • 1
    Спасибо за ссылку @ miles82 (и править, @voyager). Насколько питонезким и безопасным является такой подход? – Morlock 8 April 2010 в 15:57
  • 2
    К сожалению, это решение не сохраняет самую удобную часть defaultdict, которая позволяет записывать что-то вроде D ['key'] + = 1, не беспокоясь о существовании ключа. Это основная функция, которую я использую defaultdict для ... но я могу представить, что динамически углубляющиеся словари тоже очень удобны. – rschwieb 25 March 2014 в 02:21
  • 3
    @rschwieb вы можете добавить мощность для записи + = 1, добавив метод add . – spazm 21 August 2014 в 22:54
  • 4
    если они повышают NotImplemented, а не ValueError? – spazm 25 August 2014 в 23:41
Другие вопросы по тегам:

Похожие вопросы: