Вопрос

Есть ли Backport для следующих методов для работы с Python 2.4:

any, all, collections.defaultdict, collections.deque
Это было полезно?

Решение

Ну, по крайней мере, для any а также all это просто:

def any(iterable):
    for element in iterable:
        if element:
            return True
    return False

def all(iterable):
    for element in iterable:
        if not element:
            return False
    return True

deque уже в 2.4.

Что касается defaultdict, Я думаю, вы можете легко подражать этому setdefault().

Цитата от Алекс Мартелли (а другие) настоятельно рекомендуется Python Cookbook:

Это то, для чего является метод SetDefault для словарей. Скажем, мы создаем индекс слова к страницам, словарь, который отображает каждое слово в список номеров страниц, где оно появляется. Ключевой кусок кода в этом приложении может быть:

def addword(theIndex, word, pagenumber):
    theIndex.setdefault(word, [ ]).append(pagenumber)

Этот код эквивалентен более многословным подходам, таким как:

def addword(theIndex, word, pagenumber):
    if word in theIndex:
        theIndex[word].append(pagenumber)
    else:
        theIndex[word] = [pagenumber]

а также:

def addword(theIndex, word, pagenumber):
    try:
        theIndex[word].append(pagenumber)
    except KeyError:
        theIndex[word] = [pagenumber]

Другие советы

Как Тим указывает, all а также any тривиальны. defaultdict не намного сложнее. Вот проходимая реализация, которую я верю. Это, по сути, это перевод документов в код.

Обновление: Удаленное тройное выражение, потому что я вспомнил, что это не в 2.4

class defaultdict(dict):
     def __init__(self, default_factory, *args, **kwargs):
         super(defaultdict, self).__init__(*args, **kwargs)
         self.default_factory = default_factory

     def __missing__(self, key):
         try:
             self[key] = self.default_factory()
         except TypeError:
             raise KeyError("Missing key %s" % (key, ))
         else:
             return self[key]

     def __getitem__(self, key):
         try:
             return super(defaultdict, self).__getitem__(key)
         except KeyError:
             return self.__missing__(key)

Если вы просто используете его, чтобы построить Dict, вы можете изменить EAFP для LBYL для __getitem__. Отказ Прямо сейчас он оптимизирован, чтобы построить Dict, а затем использовать его некоторое время с большим количеством не мисс поиска.

deque собирается быть жестче. Я хотел бы, чтобы у меня было время сделать это только потому, что это, вероятно, мой любимый из коллекций, но это не тривиально. не бери в голову. Просто прочитайте Tims Post до конца. Вы получили свое желание.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top