私はコレクションがセットかディクテーションのいずれかであると考えます。問題は、それがある:コレクションが辞書であればPython 2.7のdictのセットや値を反復する普遍的な方法はありますか?
for element in collection:
print element
はコレクションが設定されている場合は、私に要素を与えるが、インデックスされます。私が望むのは、ディクティック値を反復する1ライナーです。
これは可能ですか?
私はコレクションがセットかディクテーションのいずれかであると考えます。問題は、それがある:コレクションが辞書であればPython 2.7のdictのセットや値を反復する普遍的な方法はありますか?
for element in collection:
print element
はコレクションが設定されている場合は、私に要素を与えるが、インデックスされます。私が望むのは、ディクティック値を反復する1ライナーです。
これは可能ですか?
マッピングをテストするための最も確実な方法はcollections.Mapping
にisinstance
を使用することです:
import collections
for element in (collection.values()
if isinstance(collection, collections.Mapping) else collection):
あなたが頻繁にそれを行う必要がある場合(あなたはいけない、またはあなたはおそらく設計上の問題を持っている)、あなたは機能に移動できます。
def values(collection):
return (collection.values()
if isinstance(collection, collections.Mapping) else collection)
for element in values(collection):
+1は「おそらくデザイン上の問題がある」 – Daenyth
import collections
def values(collection):
for v in collection.values() if isinstance(collection, collections.Mapping) else collection:
yield v
for element in values(collection):
print element
編集:私はcollections.Mapping
suggestion from agfをコピーしたが。私の答えは、ソリューションを関数として実装することによって異なります。私はPythonが問題を再利用可能な部分に分割するのに非常に役立つことを発見しました。
方法について:特に "悪い習慣" であることを除いて裸について洗脳それらのための
def vals(c):
try: return c.values()
except: return c
for a in vals(whatever):
...
:
find "/System/Library/Frameworks/Python.framework" -name "*.py" | xargs grep "except:" | wc -l
2901
ことを伝えに行きます。
'getattr(type(collection)、 'values'、iter)(collection)'が思い浮かびますが、これをすることは絶対に勧められません。過度に巧妙なハックである。これを避ける方法はありますか?より明示的なチェック(複数の行にまたがっていなければならないでしょう)では何が問題になりますか? – delnan
@delnanそれは間違いなく間違った方法ですが、またかなり賢いです。今私はそのようなデフォルト値を使用するいくつかの恐ろしい方法を考える必要があります... – agf
あなたはどのようなタイプを取得しているのですか? – Daenyth