字典作为关键值?

时间:2015-05-20 01:28:15

标签: python csv dictionary

我一直在寻找我的答案,可能只是没有使用正确的措辞,而只是使用列表作为字典键值。

我需要获取20个csv文件和anonomyze来识别学生,教师,学校和学区信息,以便进行测试数据的研究。 csv文件的范围从20K到50K行和11到20列,并非所有列都具有相同的信息。

一个文件可能包含:

studid, termdates, testname, score, standarderr

另一个可能有:

termdates, studid, studfirstname, studlastname, studdob, ethnicity, grade

而另一个可能有:

termdates, studid, teacher, classname, schoolname, districtname

我将不同的数据放入每种类型的文件/数据集的字典中,也许这不是最好的,但是当我尝试使用字典作为学生可能服用多个字符的关键值时,我会陷入困境测试即语言,阅读,数学等。

例如:

studDict{studid{'newid': 12345, 'dob': 1/1/1, test1:{'score': 50, 'date': 1/1/15}, test2:{'score': 50, 'date': 1/1/15}, 'school': 'Hard Knocks'},
        studid1{'newid': 12345, 'dob': 1/1/1, test1:{'score': 50, 'date': 1/1/15}, test2:{'score': 50, 'date': 1/1/15}, 'school': 'Hard Knocks'}}

有关哪些图书馆或方法的简要指示将受到高度赞赏的任何指导。我理解足够的Python,我不需要全手拿着,但帮助我穿过街道会很棒。 :d

澄清

我有更好的机会赢得彩票而不是这个项目多次使用,所以方法越简单越好。如果它是一个重复的项目,我很可能会将数据转储到db表中并从那里开始工作。

5 个答案:

答案 0 :(得分:1)

您不能将字典用作字典的键。密钥必须是可清除的(即不可变的),而字典不是,因此不能用作密钥。

您可以将字典存储在另一个字典中,与其他任何字典相同。例如,您可以

studDict = { studid: {'newid': 12345, 'dob': 1/1/1, test1:{'score': 50, 'date': 1/1/15}, test2:{'score': 50, 'date': 1/1/15}, 'school': 'Hard Knocks'},
    studid1: {'newid': 12345, 'dob': 1/1/1, test1:{'score': 50, 'date': 1/1/15}, test2:{'score': 50, 'date': 1/1/15}, 'school': 'Hard Knocks'}}

假设您已在其他地方定义studidstudid1

答案 1 :(得分:1)

字典不能是键,但字典可以是另一个字典中某个键的值(字典词典)。 然而,为每个元组实例化不同长度的字典可能会使您的数据分析变得非常困难。

考虑使用Pandas将元组读入具有null值的DataFrame中。

dict API:https://docs.python.org/2/library/stdtypes.html#mapping-types-dict

Pandas数据处理包:http://pandas.pydata.org/

答案 2 :(得分:0)

如果我正确地解释了你,最后你想要一个dict与学生(即studid)作为关键和不同的学生相关数据作为价值?这可能不是你想要的,但我认为它会指出你正确的方向(改编自this answer):

import csv
from collections import namedtuple, defaultdict

D = defaultdict(list)
for filename in files:
    with open(filename, mode="r") as infile:
        reader = csv.reader(infile)
        Data = namedtuple("Data", next(reader))
        for row in reader:
            data = Data(*row)
            D[data.studid].append(data)

最后应该为您提供一个字母D,其中stuid为密钥,测试结果列表为值。每个测试结果都是namedtuple这假设每个文件都有studid列!

答案 3 :(得分:0)

如果你能提前知道文件的顺序,那么在csv的帮助下制作一本字典就不难了。

档案tests.csv

12345,2015-05-19,AP_Bio,96,0.12
67890,2015-04-28,AP_Calc,92,0.17

在与tests.csv相同的目录中的Python文件中:

import csv

with open("tests.csv") as tests:
    # Change the fields for files that follow a different form
    fields = ["studid", "termdates", "testname", "score", "standarderr"]
    students_data = list(csv.DictReader(tests, fieldnames=fields))

# Just a pretty show
print(*students_data, sep="\n")
# {'studid': '12345', 'testname': 'AP_Bio', 'standarderr': '0.12', 'termdates': '2015-05-19', 'score': '96'}
# {'studid': '67890', 'testname': 'AP_Calc', 'standarderr': '0.17', 'termdates': '2015-04-28', 'score': '92'}

答案 4 :(得分:0)

请更明确。您的解决方案取决于设计。

在学区,你有学校,每所学校都有老师或学生。

首先按地区和学校订购数据

    districts = { 
                 "name_district1":{...}, 
                 "name_district2":{...},
                 ...,
                 "name_districtn":{...},
                }
每个区域

    # "name_districtn"
      {
        "name_school1": {...},
        "name_school2": {...},
        ...,
        "name_schooln": {...},
      }

每所学校:     #" name_schooln"

{
  id_student1: {...},
  id_student2: {...},
  ...,
  id_studentn: {...}  
}

并为每个学生......定义他的元素

您还可以为所有学生定义一个字典,但在这种情况下您必须为每个学生设计一个uniq id,例如:

   uniq_Id = "".join(("name_district","name_school", str(student_id)))
   Total = {
             uniq_Id: {'dob': 1/1/1, test1:{'score': 50, 'date': 1/1/15}, test2:{'score': 50, 'date': 1/1/15}, 'school': 'Hard Knocks'}} ,
           ...,
           }