以下方法是否有任何反向移植可用于 python 2.4:
any, all, collections.defaultdict, collections.deque
正如蒂姆指出的那样,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 for __getitem__
. 现在它被优化为构建字典,然后使用它一段时间并进行大量的非错过查找。
没关系。只需阅读 Tims 的帖子即可。你如愿以偿。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()
.
引用 Alex Martelli(和其他人)强烈推荐的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]