以下方法是否有任何反向使用python 2.4:
any, all, collections.defaultdict, collections.deque
答案 0 :(得分:5)
好吧,至少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方法 词典是为了。说我们是 建立一个单词到页码 index,一个映射每个单词的字典 到它的页码列表 出现。这是一段关键代码 申请可能是:
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]
答案 1 :(得分:5)
蒂姆指出,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)
如果您只是使用它来构建字典,那么您可能希望将EAFP更改为__getitem__
的LBYL。现在它已经过优化,可以构建dict,然后使用它一段时间进行大量的非错失查找。
没关系。刚刚阅读Tims的帖子。你明白了。deque
将更加艰难。我希望我有时间这样做只是因为它可能是我最喜欢的收藏品,但它并非无足轻重。