在python中从字典中创建所选项的数组/列表

时间:2013-09-20 12:50:54

标签: python dictionary

需要一些python词典的指导,如果可以请帮助..

我有一本看起来像的字典(它有100个名字,但我给你看样品):

{'John':{'Maths':40,
        'Eng':50,
        'Phy':67,
        'Chem':78}
'Kate':{'Maths':98,
       'Chem':83}
'Julia':{'Phy':76,
         'Eng':67,
         'Maths':56,
         'Bio':78}
'Sam':{'Phy':23,
       'Eng':67,
       'Chem':98,
       'Maths':56}}

我想要的是是制作一个包含学生姓名及其各自英文标记的两列(或两个数组)的表格,如果他们没有任何标记Bio。(即Julia的名字不应该在列表中)。

在python中可以优雅地完成这项工作吗? : - /

2 个答案:

答案 0 :(得分:2)

这使用列表理解来完成工作,随意考虑它优雅:

h = {'John': {'Maths': 40, 'Eng':50, 'Phy': 67, 'Chem': 78},
     'Kate': {'Maths': 98, 'Chem': 83},
     'Julia': {'Phy': 76, 'Eng': 67, 'Maths': 56, 'Bio': 78},
     'Sam': {'Phy': 23, 'Eng': 67, 'Chem': 98, 'Maths': 56}}
print [(k, v.get('Eng')) for k, v in h.iteritems() if 'Bio' not in v]

输出:

[('Sam', 67), ('John', 50), ('Kate', None)]

print循环中使用for将其格式化为表格。

答案 1 :(得分:2)

一个简单的for循环和一些字符串格式化(since we already have a list comprehension):

data = {'John': {'Maths': 40, 'Eng':50, 'Phy': 67, 'Chem': 78},
        'Kate': {'Maths': 98, 'Chem': 83},
        'Julia': {'Phy': 76, 'Eng': 67, 'Maths': 56, 'Bio': 78},
        'Sam': {'Phy': 23, 'Eng': 67, 'Chem': 98, 'Maths': 56}}

print "name\tmark\n------------"            
for name, marks in data.iteritems():
    if not 'Bio' in marks:
        print "{name}\t{mark}".format(name=name, mark=marks.get('Eng', '---'))

<强>输出:

name    mark
------------
Sam     67
John    50
Kate    ---

回应你的评论:

使用zip - 功能:

zip(*[(k,v['Eng']) for k,v in data.iteritems() if not 'Bio' in v and 'Eng' in v])

结果

[('Sam', 'John'), (67, 50)]