Преобразовать вложенный список в словарь - PullRequest
0 голосов
/ 20 января 2019

Я новичок в python и узнаю о вложенных списках и словарях.В настоящее время я работаю над заданием, в котором мне нужно преобразовать список с оценками учащихся в словарь, где оценки являются целыми числами:

student_grades = [
    ['Student', 'Exam 1', 'Exam 2', 'Exam 3'],
    ['Jane', '100', '90', '80'], 
    ['John', '88', '99', '111'],
    ['David', '45', '56', '67']
]

Вывод должен выглядеть следующим образом:

{[«Джейн»: [100, 90, 80], [«Джон»]: [88, 99, 11], [«Давид»]: «45», «56», «67»]}

Я не уверен, как преобразовать несколько вложенных списков в словарь.Благодарю, если кто-нибудь может указать мне правильное направление.

Ответы [ 2 ]

0 голосов
/ 20 января 2019
#Convert digits in string to numbers.
student_grades_int = [[int(i) if i.isdigit() else i for i in myList] for myList in student_grades]
student_grades_int = student_grades_int[1:]

#Using list comprehensions to create the structure.
student_grades_final = {[x for x in myList if isinstance(x, str)][0]:[x for x in myList if isinstance(x, int)] for myList in student_grades_int}
student_grades_final
     {'David': [45, 56, 67], 'Jane': [100, 90, 80], 'John': [88, 99, 111]}
0 голосов
/ 20 января 2019

Ваши ключи словаря не могут быть списками †.Возможно, вам нужны строки, а не списки с одним элементом.

Т.е. 'Jane' вместо ['Jane'].


Вы можете использовать словарь-понимание;итерация со второго подсписка и далее.Мы также используем списки для преобразования оценок в целые числа.

{name:[int(score) for score in scores] for name,*scores in student_grades[1:]}

, что дает:

{
  "Jane": [
    100,
    90,
    80
  ],
  "John": [
    88,
    99,
    111
  ],
  "David": [
    45,
    56,
    67
  ]
}

† Причина, по которой вы не можете использовать списки в качестве ключей длясловари, потому что они не хэш .Словарь - это, по сути, хеш-таблица, в которой элементы хранятся в ячейках памяти, связанных с их хэшами, так что вы можете быстро «искать» элемент в словаре.Однако это работает только в том случае, если каждая клавиша может быть хешированной, чего не может быть в списке.Почему не может это?Потому что хеш должен учитывать все составляющие элемента объекта и не должен изменяться.Однако элементы списка могут изменяться, потому что это изменяемая структура данных (в отличие от неизменяемой строки или кортежа и т. Д.), Следовательно, он не может надежно вычислять тот же хэш, поэтому не может / не может реализовать эту функциональность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...