2013-09-20 4 views
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 нет никаких оценок. (т. Е. Имя Джулии не должно быть в списке).

Можно ли это сделать элегантно в python? : -/

+4

Да, это может быть сделано довольно элегантно. Это сделало бы хороший вопрос о домашнем задании. –

+0

Я пытаюсь использовать my_dictionary.iteritems() с циклом for, но я не могу придумать хорошее решение. – Panchi

+0

@Panchi. Вы действительно должны опубликовать свой код до сих пор, чтобы другие люди могли комментировать это то, что на самом деле неправильно. – sloth

ответ

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

это работает .. спасибо :) BDW, может у меня есть эти два coloumns от имени и знака в виде двух массивов как >> имя = [сэм, джон] >> знак = [67,50] ??? если возможно, я не хочу, чтобы в списке был kate .. – Panchi

+0

@Panchi См. Мое редактирование. – sloth

+0

это замечательно !! – Panchi

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

Это вызовет KeyError. – sloth

+0

это действительно бросает KeyError .. это потому, что «Eng» нет для всех ключей? Например, у Кейт нет меток на английском языке. – Panchi

+0

Исправлена ​​ошибка KeyError. – pts

Смежные вопросы