1

需要一些关于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 中优雅地做到这一点?:-/

4

2 回答 2

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其格式化为表格。

于 2013-09-20T12:54:15.007 回答
2

一个简单的for循环和一些字符串格式就可以了(因为我们已经有了一个列表理解):

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)]
于 2013-09-20T12:57:47.220 回答