Создание словаря из CSV-файла с конкретными ключами - PullRequest
0 голосов
/ 25 августа 2018

У меня есть CSV-файл с подробной информацией о преподавателях. Несколько членов имеют одинаковую фамилию. Я пытаюсь создать словарь с фамилиями в качестве ключей и другими деталями в качестве значений. Тип данных выглядит следующим образом:

name,degree,title
S.li,phd,Associate Professor of Biostats
d.Chiou,MD, Professor ofABC
F.Li,MPH Professor of DCD

Я пытаюсь получить словарь следующим образом:

mydict={"Li":[[' phd.', 'Associate Professor of Biostats'], ['MPH','Professor of DCD']] 'Chiou': [[' MD', 'Professor of ABC']]}

Я использовал следующий код, он не работает.

reader = csv.reader(open('faculty.csv'))  
mydict = {}  
for rows in reader:  
    k = rows[0]  
    v = rows[1:]  
    mydict[k] = v
print (mydict)

Я такжепопробовал этот код:

    reader = csv.reader(open('faculty.csv'))
    mydict = {rows[0]:rows[1:] for rows in reader}
    print (mydict)

1 Ответ

0 голосов
/ 25 августа 2018

Ваши code и demo data имеют 2 проблемы:

  1. Ваши фамилии имеют различную заглавную букву - следовательно, они отличаются при использовании в качестве ключа.
  2. Ваши имена имеют префикс фамилий - вы не отделяете часть фамилии от них.

Вы можете указать обе вещи в коде.Я предполагаю, что ваше «фамилия» всегда является последней строкой первого столбца после последней точки в нем, все вещи перед фамилией.


Создать файл демонстрационных данных с дубликатомзапись (Li vs Li vs li)

with open("faculty.csv","w") as f:
    f.write("""name,degree,title
S.li,phd,Associate Professor of Biostats
d.Chiou,MD, Professor of ABC
F.Li,MPH, Professor of DCD
K.Li,MPH Professor of XYZ
""")

Обработка CSV-файла в dict

import csv

# process data
mydict = {}

with open('faculty.csv') as r:
    reader = csv.reader(r)  
    # skip header row
    next(reader, None) 
    # process data rows
    for rows in reader:   
        k = rows[0]
        v = rows[1:]  

        # Name has . in it: 
        if '.' in k:
            # all before last . is surname, after last . is lastName
            # we add surnames to the data, use only lastName as key
            lastName = k.split('.')[-1]
            surName = k[:-len(lastName)] # strip key from name part
            v.append(surName)            # add surname-parts to data
        else:
            lastName = k                 # no surnames

        # create/get key in/from dict if needed, prepopulate value with empty list
        key = mydict.setdefault(lastName,[])
        # append data
        key.append(v)

print (mydict)

Вывод (отформатированный):

{'Chiou': [['MD', ' Professor of ABC', 'd.']], 
 'Li':    [['MPH', ' Professor of DCD', 'F.'], ['MPH Professor of XYZ', 'K.']], 
 'li':    [['phd', 'Associate Professor of Biostats', 'S.']]}

Если ваши данные неверны, вы можете подумать об исправлении имен с помощью .capitalize() или .title() на клавише:

name = "one naMe"

print(name[0].upper()+name[1:])
print(name.capitalize())
print(name.title())

Вывод:

One naMe     # name[0].upper()+name[1:]
One name     # .capitalize()
One Name     # .title()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...