2016-07-04 43 views
3

说我有一个快译通,看起来像这样具体的字典属性值...正从多个列表

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' 
        }] 

    } 

我试图让

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

但我试图做所以没有循环循环。

所以这是我:

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

而且它抛出:

TypeError: string indices must be integers 

我怎样才能使这项工作?

+1

我可以问你为什么需要一个包含“场”和“说明”一本字典?这似乎不是使用字典的有效方式。 –

回答

5

你得到的错误,因为字典是一个级别高于你的循环深,你可以致电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()

1

你也可以做到这一点完全功能相结合,mapitertools.chain.from_iterableoperator.itemgetter

from operator import itemgetter 
from itertools import chain 

print(list(map(itemgetter("field"), chain.from_iterable(values.values())))) 
['course_code', 'prefix', 'suffix', 'student_email']