def getSortedKeyList(dl):
    kl = list(dl.items())
    kl.sort()
    return kl

def tupleListToDict(a):
    b = {}
    for k, v in a:
        b[k] = b.get(k, [])+v
    return b

def main():
    gradeList = [('Zaphod', [33, 20]), ('Zaphod', [75, 48]), \
                 ('Slartibartfast', []), ('Trillian', [98, 88]), \
                 ('Trillian', [97, 77]), ('Slartibartfast', []), \
                 ('Marvin', [2000, 500]), ('Authur', [42, 20]), \
                 ('Authur', [64]), ('Trillian', [99]), \
                 ('Marvin', [450]), ('Marvin', [550]), \
                 ('Agrajag', []), ('Agrajag', []), ('Agrajag', [0]), \
                 ('Ford', [50]), ('Ford', [50]), ('Ford', [50])]

    print('\t', '\t', "Grade", '\t')
    print('\t', "Name", '\t', "Count", '\t', "Average")
    print("-----------------------------------------")

    dicList = tupleListToDict(gradeList)            
    dicList = getSortedKeyList(dicList)

    for k, v in dicList:
        print(k, len(v), '\t', sum(v)/len(v))

Я пытаюсь сделать таблицу из словаря. Прежде всего, я преобразовал кортеж в словарь и отсортировал словарь по ключам. Затем я пытаюсь распечатать (ключи, количество ключей, среднее значение). Однако, когда я пытаюсь выполнить sum(v)/len(v) для средней части, я получаю ошибку деления на ноль. Чтобы избежать ошибки, я попытался вернуть пустое значение из словаря в 0, но я просто не знаю, как это сделать. Пожалуйста помоги.

0
Steffen You 6 Ноя 2014 в 09:10

2 ответа

def getSortedKeyList(dl):
    kl = list(dl.items())
    kl.sort()
    return kl

def tupleListToDict(a):
    b = {}
    for k, v in a:
        b[k] = b.get(k, [])+v
    return b

def main():
    gradeList = [('Zaphod', [33, 20]), ('Zaphod', [75, 48]), \
                 ('Slartibartfast', []), ('Trillian', [98, 88]), \
                 ('Trillian', [97, 77]), ('Slartibartfast', []), \
                 ('Marvin', [2000, 500]), ('Authur', [42, 20]), \
                 ('Authur', [64]), ('Trillian', [99]), \
                 ('Marvin', [450]), ('Marvin', [550]), \
                 ('Agrajag', []), ('Agrajag', []), ('Agrajag', [0]), \
                 ('Ford', [50]), ('Ford', [50]), ('Ford', [50])]

    print('\t', '\t', "Grade", '\t')
    print('\t', "Name", '\t', "Count", '\t', "Average")
    print("-----------------------------------------")

    dicList = tupleListToDict(gradeList)            
    dicList = getSortedKeyList(dicList)

    for k, v in dicList:
      try:
          print(k, len(v), '\t', sum(v)/len(v))
     except ZeroDivisionError as detail:
          print('Handling run-time error:', detail)

Вы можете поймать исключение ZeroDivisionError с помощью блока try and catch;

0
Isuru Madusanka 6 Ноя 2014 в 09:19

Slartibartfast не имеет оценок, поэтому len(v) равен 0, когда вы доберетесь до его записи.

В зависимости от того, каким должно быть его «среднее», вы можете изменить последний цикл на что-то вроде:

for k, v in dicList:
    print(k, len(v), '\t', sum(v)/len(v) if len(v)>0 else 'N/A')
0
mojo 6 Ноя 2014 в 09:20