2

以下方法是否有任何反向移植可用于 python 2.4:

any, all, collections.defaultdict, collections.deque
4

2 回答 2

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)

如果您只是使用它来构建一个 dict,那么您可能希望将 EAFP 更改为 LBYL for __getitem__. 现在它被优化为构建字典,然后使用它一段时间并进行大量的非错过查找。

deque将会变得更加艰难。我希望我有时间这样做只是因为它可能是我最喜欢的系列,但它并非微不足道。没关系。只需阅读 Tims 的帖子即可。你如愿以偿。

于 2010-09-24T08:49:58.080 回答
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 方法的用途。假设我们正在构建一个单词到页码索引,这是一个将每个单词映射到它出现的页码列表的字典。该应用程序中的一段关键代码可能是:

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]
于 2010-09-24T08:40:21.963 回答