2016-07-04 13 views
3

は私が複数のリストから特定のdictのプロパティ値を取得

['prefix', 'suffix', 'student_email', 'course_code'] 

を取得しようとしている。しかし、私がやろうとしている

values = { 
     'student': [{ 
        'field': 'prefix', 
        'description': 'First name' 
        }, 
        { 
        'field': 'suffix', 
        'description': 'Last name' 
        }, 
        { 
        'field': 'student_email', 
        'description': 'Email address' 
        }], 
     'classes': [{ 
        'field': 'course_code', 
        'description': 'Course code' 
        }] 

    } 

...私はそうのように見えるDictのを持っていると言いますループ内のループを使用しないでください。

だからこれは私が持っているものです。

stored = [] # store the field values in a list 
for value in values: 
    stored.append(value['field']) 

そしてそれは投げ:

TypeError: string indices must be integers 

どのように私はこの作業を行うことができますか?

+1

あなたは「フィールド」と「説明」を含む辞書を必要とする理由私が聞いてもいいですか?これは辞書を使用する効率的な方法のようには見えません。 –

答えて

5

辞書はあなたのループよりも1つのレベル深い、そしてあなたが値部分を取得するために辞書にitems()を呼び出すことができますので、あなたがエラーを取得する:

[v1['field'] for k, v in values.items() for v1 in v] 
# ['prefix', 'suffix', 'student_email', 'course_code'] 
+0

Doh!あなたが正しい。あなたの助けてくれてありがとう:D – Modelesq

+0

私はPythonには比較的新しいですが、そのようなループでループを使うのはクールですか? – Modelesq

+1

これは 'list comprehension'と呼ばれ、非常に一般的にはPython言語で使用されています。だから私はそれを使うのが安全だと言うでしょう。 – Psidom

2

あなただけではこれらの文字列を収集する必要がある場合リストが、あなたは特定の順序でそれらを手配するように制約されていないが、これは動作するはずです:

>>> from itertools import chain 
>>> [x['field'] for x in chain(*values.values())] 
['course_code', 'prefix', 'suffix', 'student_email'] 

上記のスニペットのコア要素は機能itertools.chain()です。また、それは完全に機能的に、mapitertools.chain.from_iterableoperator.itemgetterを組み合わせて行うことができます

1

from operator import itemgetter 
from itertools import chain 

print(list(map(itemgetter("field"), chain.from_iterable(values.values())))) 
['course_code', 'prefix', 'suffix', 'student_email'] 
関連する問題