Python2.4で動作する次のメソッドのバックポートはありますか?
any, all, collections.defaultdict, collections.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クックブックからの引用:
これが、辞書の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]
ティムが指摘するように、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
厳しくなるでしょう。それがコレクションの中でおそらく私のお気に入りであるという理由だけでそれをする時間があればいいのにと思いますが、それは些細なことではありません。