Python - Создание словаря из таблицы NumPy для отображения списков - PullRequest
0 голосов
/ 22 января 2019

Учитывая приведенную ниже таблицу NumPy

GR = [
    ['Student', 'Exam 1', 'Exam 2', 'Exam 3'],
    ['PersonA', '100', '90', '80'],
    ['PersonB', '88', '99', '111'],
    ['PersonC', '45', '56', '67'],
    ['PersonD', '59', '61', '67'],
    ['PersonE', '73', '79', '83'],
    ['PersonF', '89', '97', '101']
     ]

Мне нужно создать словарь с именем GL, который отображает имена учащихся в списки их экзаменационных оценок.оценки должны быть переведены из str в int.

Desired Output: {'PersonA':[100, 90, 80], 'PersonB':[88, 99, 111], ect....}

Ответы [ 5 ]

0 голосов
/ 01 февраля 2019

Мои извинения @Charles Landau, мой навык Python значительно улучшился с тех пор, как задал этот вопрос.

GL = dict() 
     for i in GR[1:]:
          GL[i[0]] = [int(i[1]),int(i[2]),int(i[3])]
     print(GL)
0 голосов
/ 22 января 2019

Ваш GR является массивом numpy (и использование индексации a[2,0] подтверждает это):

In [179]: GR
Out[179]: 
array([['Student', 'Exam 1', 'Exam 2', 'Exam 3'],
       ['PersonA', '100', '90', '80'],
       ['PersonB', '88', '99', '111'],
       ['PersonC', '45', '56', '67'],
       ['PersonD', '59', '61', '67'],
       ['PersonE', '73', '79', '83'],
       ['PersonF', '89', '97', '101']], dtype='<U7')

Итак, что вы делаете:

In [185]: {row[0]: row[1:] for row in GR[1:]}
Out[185]: 
{'PersonA': array(['100', '90', '80'], dtype='<U7'),
 'PersonB': array(['88', '99', '111'], dtype='<U7'),
 'PersonC': array(['45', '56', '67'], dtype='<U7'),
 'PersonD': array(['59', '61', '67'], dtype='<U7'),
 'PersonE': array(['73', '79', '83'], dtype='<U7'),
 'PersonF': array(['89', '97', '101'], dtype='<U7')}

Массивы строк можно легко преобразовать в целые числа с помощью:

In [186]: {row[0]: row[1:].astype(int) for row in GR[1:]}
Out[186]: 
{'PersonA': array([100,  90,  80]),
 'PersonB': array([ 88,  99, 111]),
 'PersonC': array([45, 56, 67]),
 'PersonD': array([59, 61, 67]),
 'PersonE': array([73, 79, 83]),
 'PersonF': array([ 89,  97, 101])}

и в списках:

In [187]: {row[0]: row[1:].astype(int).tolist() for row in GR[1:]}
Out[187]: 
{'PersonA': [100, 90, 80],
 'PersonB': [88, 99, 111],
 'PersonC': [45, 56, 67],
 'PersonD': [59, 61, 67],
 'PersonE': [73, 79, 83],
 'PersonF': [89, 97, 101]}

Моя номинация для преобразования списка:

In [188]: {name: [int(i) for i in grades] for name, *grades in GR[1:]}
Out[188]: 
{'PersonA': [100, 90, 80],
 'PersonB': [88, 99, 111],
 'PersonC': [45, 56, 67],
 'PersonD': [59, 61, 67],
 'PersonE': [73, 79, 83],
 'PersonF': [89, 97, 101]}
0 голосов
/ 22 января 2019

Альтернативное решение с Python 3, использующее map для преобразования оценок из str с в int с и частичной распаковки для разделения каждого списка на person и их grades

In [111]: {person: list(map(int, grades)) for person, *grades in GR[1:]}
Out[111]:
{'PersonA': [100, 90, 80],
 'PersonB': [88, 99, 111],
 'PersonC': [45, 56, 67],
 'PersonD': [59, 61, 67],
 'PersonE': [73, 79, 83],
 'PersonF': [89, 97, 101]}

Python 2 эквивалент

{g[0]: map(int, g[1:]) for g in GR[1:]}
0 голосов
/ 22 января 2019

Опция 1:

GR_ = {i[0]: list(map(int, i[1:])) for i in GR[1:]}

Опция 2:

GR_ = dict(map(lambda x: (x[0], list(map(int, x[1:]))), GR[1:]))

Выход:

{'PersonA': [100, 90, 80],
 'PersonB': [88, 99, 111],
 'PersonC': [45, 56, 67],
 'PersonD': [59, 61, 67],
 'PersonE': [73, 79, 83],
 'PersonF': [89, 97, 101]}
0 голосов
/ 22 января 2019

У меня небольшие проблемы с пониманием, но я думаю, это то, что вы ищете:

GL = [
    {x[0]: [int(j) for j in x[1:]]} for x in GR[1:]
]

Выход:

[{'PersonA': [100, 90, 80]},
 {'PersonB': [88, 99, 111]},
 {'PersonC': [45, 56, 67]},
 {'PersonD': [59, 61, 67]},
 {'PersonE': [73, 79, 83]},
 {'PersonF': [89, 97, 101]}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...