khe*_*lll 2 python methods backport
以下方法是否有任何backport用于python 2.4:
any, all, collections.defaultdict, collections.deque
Run Code Online (Sandbox Code Playgroud)
好吧,至少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
Run Code Online (Sandbox Code Playgroud)
deque 已经在2.4了.
至于defaultdict,我猜你可以轻松地模仿setdefault().
来自Alex Martelli(和其他人)的引用强烈推荐Python Cookbook:
这就是字典的setdefault方法.假设我们正在构建一个单词到页面数字索引,这是一个将每个单词映射到它出现的页码列表的字典.该应用程序中的关键代码可能是:
def addword(theIndex, word, pagenumber):
theIndex.setdefault(word, [ ]).append(pagenumber)
Run Code Online (Sandbox Code Playgroud)
此代码等同于更详细的方法,例如:
def addword(theIndex, word, pagenumber):
if word in theIndex:
theIndex[word].append(pagenumber)
else:
theIndex[word] = [pagenumber]
Run Code Online (Sandbox Code Playgroud)
和:
def addword(theIndex, word, pagenumber):
try:
theIndex[word].append(pagenumber)
except KeyError:
theIndex[word] = [pagenumber]
Run Code Online (Sandbox Code Playgroud)
蒂姆指出,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)
Run Code Online (Sandbox Code Playgroud)
如果您只是用它来构建一个字典,那么您可能想要将EAFP更改为LBYL __getitem__.现在,它已经过优化,可以构建dict,然后使用它一段时间进行大量的非错过查找.
没关系.刚刚阅读Tims的帖子.你有你的愿望.deque会变得更加强硬.我希望我有时间这样做只是因为它可能是我最喜欢的收藏品,但它并非无足轻重.