2015-05-20 292 views
0

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

我需要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

澄清

我买彩票中奖超过这个项目确实被多次使用,所以简单的方法更好的一个更好的机会。如果这将是一个重复的项目,我很可能将数据转储到数据库表中并从那里开始工作。

+0

尝试sqldict Python模块,它可以帮助你 – sudhishkr

+2

“这个项目将永远不会被使用一次以上,所以我只是一起破解它“似乎是用来确保为公司构建新核心产品的关键短语 –

+0

它通过另一个部门通过另一个部门部门,他们需要'昨天'大声笑。 – bmeredith

回答

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别处。

+0

没错,但我问的是使用字典作为键值,而不是键本身,也许我应该重新说一句。 – bmeredith

+1

@bmeredith:不知道这意味着什么。你能否给我们一个你遇到问题的价值的例子,以及你如何尝试使用它们? – Amadan

+1

@bmeredith什么是“关键价值”?有“钥匙”,有“价值”,但我不知道什么是“关键价值”。如果你想使用它们作为值,那么在执行'dict1 [key] = dict2'时应该没有任何困难,然后'dict2'将被映射到'key'的'dict1'中的值。 –

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) 

到底应该给你的字典Dstuid S作为键和测试结果列表作为值。每个测试结果是一个namedtuple这假设每个文件都有一个studid列!

+0

是的,每个文件都有studid,这是唯一重复的数据。 – bmeredith

0

如果您可以提前知道文件的顺序,那么在csv的帮助下为它创建字典并不困难。

文件tests.csv

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

在同一个目录下一个Python文件作为tests.csv

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'} 
+0

这是现在正在使用的方法,但是布局本质上是一个字典词典,它可能有字典作为某些键的值,这会让我更加恐惧 – bmeredith

+0

您能解释一下吗?你的目标是在他们的测试中使用带有学生ID和数据列表值的键的字典吗? – Navith

+0

所以基本上studDict {studID1 {key:val,key:val,key:{key:val,key:val,key:val},key:val,key:val},studID2 {key:val,key:val, key:{key:val,key:val,key:val},key:val,key:val}} – bmeredith

0

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

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

首先你通过地区和学校

districts = { 
       "name_district1":{...}, 
       "name_district2":{...}, 
       ..., 
       "name_districtn":{...}, 
       } 

订购您DATAS每个distric:

# "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'}} , 
      ..., 
      }