2012-04-25 7 views
2

私はコレクションがセットかディクテーションのいずれかであると考えます。問題は、それがある:コレクションが辞書であればPython 2.7のdictのセットや値を反復する普遍的な方法はありますか?

for element in collection: 
    print element 

はコレクションが設定されている場合は、私に要素を与えるが、インデックスされます。私が望むのは、ディクティック値を反復する1ライナーです。

これは可能ですか?

+1

'getattr(type(collection)、 'values'、iter)(collection)'が思い浮かびますが、これをすることは絶対に勧められません。過度に巧妙なハックである。これを避ける方法はありますか?より明示的なチェック(複数の行にまたがっていなければならないでしょう)では何が問題になりますか? – delnan

+0

@delnanそれは間違いなく間違った方法ですが、またかなり賢いです。今私はそのようなデフォルト値を使用するいくつかの恐ろしい方法を考える必要があります... – agf

+4

あなたはどのようなタイプを取得しているのですか? – Daenyth

答えて

9

マッピングをテストするための最も確実な方法はcollections.Mappingisinstanceを使用することです:

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): 
+0

+1は「おそらくデザイン上の問題がある」 – Daenyth

1
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が問題を再利用可能な部分に分割するのに非常に役立つことを発見しました。

+2

発電機にする必要はありません。私は私の答えで使用する条件式を関数に移すことができます(私はそれを私の答えに編集しました)、あなたは間接的なレベルを避けます。 – agf

+0

@agf、あなたの関数は、 'yield'とまったく同じジェネレータ式を使用していますか?とにかく+1。 –

+1

@ MarkRansom彼の答えにはジェネレータの表現はありません。実際は同じものですが、条件付きの式しかありません。 – delnan

-4

方法について:特に "悪い習慣" であることを除いて裸について洗脳それらのための

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 

ことを伝えに行きます。

+4

-1ポケモンの場合 – ch3ka

+1

を除いてあなたが 'except'でもっと明白だったなら、これはPythonの答えになります。 hasattr(x、 'values')else x'のx.values()の例外バージョンです。これは私の答えとあまり変わりません。ダックタイピングを使用することはここで完全に適切です。 – agf

+0

@agf:ポイントは、明示的な型チェック(地獄のようなにおいがする)なしに問題を解決できなければならないOPを示すことでした。 – georg

関連する問題