Backports Python для некоторых методов
Вопрос
Есть ли 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, а затем использовать его некоторое время с большим количеством не мисс поиска.
не бери в голову. Просто прочитайте Tims Post до конца. Вы получили свое желание.deque
собирается быть жестче. Я хотел бы, чтобы у меня было время сделать это только потому, что это, вероятно, мой любимый из коллекций, но это не тривиально.