2

Python2.4で動作する次のメソッドのバックポートはありますか?

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

2 に答える 2

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クックブックからの引用:

これが、辞書の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 に答える
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に変更することをお勧めし__getitem__ます。現在、dictを構築し、それをしばらくの間、多くの非ミスルックアップで使用するように最適化されています。

deque厳しくなるでしょう。それがコレクションの中でおそらく私のお気に入りであるという理由だけでそれをする時間があればいいのにと思いますが、それは些細なことではありません。気にしない。ティムズの投稿を最後まで読んでください。あなたはあなたの願いを叶えました。

于 2010-09-24T08:49:58.080 に答える