いくつかの方法のPythonバックポート
質問
Python 2.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()
.
アレックス・マルテリ(およびその他)から引用することを強くお勧めします 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]
他のヒント
ティムが指摘するように、 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を構築し、多くの非ミスルックアップでしばらく使用することが最適化されています。
気にしない。 Timsの投稿をずっと読んでください。あなたはあなたの願いを得ました。deque
より厳しいでしょう。おそらくそれが私のお気に入りのコレクションであるという理由だけでそれをする時間があればいいのにと思いますが、それは些細なことではありません。
所属していません StackOverflow