这是我在StackOverflow上的第一个问题,我搜索了很多网站,但找不到我想要的东西(或者没有注意到)。请不要劝阻我:)
此外,这是我与Phyton的第一次编程经历,我很困惑。
我有一个TXT文件,里面有3列用WhiteSpaces隔开。这些列为DeptID
,CourseID
,NumberofStudentsEnrolled
。
以下是示例数据:
101 10001 23
102 10002 30
102 10004 5
102 10005 13
105 10006 59
105 10007 77
因此,每当我拨打DeptID
索引和CourseID
索引时,该程序将为我提供一些注册的学生。
示例:NumberofEnrolled("101","10001")
应该给23
作为答案。
我应该尝试使用矩阵吗?因为我有点失落。我知道自己想要什么,但我不知道Phyton的名字是什么。
import numpy
depts = []
courses = []
file = open("C:\\Info.txt", "r")
# SPLIT EVERY LINE INTO 3 PIECES : DeptID , CourseID , Enrolled
for line in file:
depts.append(line.split()[0]) # ADD Depts
courses.append(line.split()[1]) # ADD Courses
# CLOSE THE FILE
file.close()
# I HAVE TRIED NUMPY BUT COULDN'T HANDLE WITH IT.
numpyList = numpy.zeros((57, 57), dtype = numpy.int32)
dept_array = numpy.array(dept)
course_array = numpy.array(course)
test_dict = {}
for i in range(len(dept_array)):
test_dict[dept_array[i]] = course_array[i]
test_dict输出是:
{'101': '10001', '102': '10005', '105': '10007'}
此输出仅获取多个数据的最后数据。我想我需要一种可以容纳多对的类型。
答案 0 :(得分:7)
您可以轻松地将数据读入字典词典:
data = {}
for line in file:
dept, course, num_students = line.split()
data.setdefault(dept, {})[course] = int(num_students)
现在你可以查找:
>>> data["101"]["10001"]
23
答案 1 :(得分:3)
其他人给了你一些选择。
我会提供,因为对(deptID,courseID)必然是唯一的,你可以使用元组作为你的密钥。
depts = dict()
depts[(101,10001)] = 23
depts[(102,10002)] = 30
depts[(102,10004)] = 5
depts[(102,10005)] = 13
depts[(105,10006)] = 59
depts[(105,10007)] = 77
print(depts)
#output: {(102, 10002): 30, (101, 10001): 23, (105, 10006): 59, (102, 10005): 13, (105, 10007): 77, (102, 10004): 5}
print(depts.keys())
#output: [(102, 10002), (101, 10001), (105, 10006), (102, 10005), (105, 10007), (102, 10004)]
#should you ever need to access all the courses associated with an ID you
#can use a filter with a lambda or more easily a List Comprehension
#to identify that data. But this will be have O(n) time look up as opposed
#to a dictionary of dictionaries which would have a O(1) look up for
#associated courseID lookups.
print([catalogue[1] for catalogue in depts.keys() if catalogue[0] == 102])
#output: [10002, 10005, 10004]
for (i,j) in depts.keys() :
print (depts[(i,j)])
#output: 30
#output: 23
#output: 59
#output: 13
#output: 77
#output: 5
答案 2 :(得分:1)
如果您将数据转换为字典,那将很容易。
打开info.txt文件并另存为info.csv。原因是,因为csv可以轻松处理空格或逗号以及任何其他分隔符。
import csv
data_dict = {}
# you can change the delimiter if its something other than space.
with open("C:\\Info.txt", "r") as fobj:
data = csv.reader(fobj, delimiter=' ')
# reading the rows/lines of the file
for row in data:
if row[0] in data_dict.keys():
data_dict[row[0]][row[1]] = row[2]
else:
data_dict[row[0]] = {row[1]: row[2]}
def func(dept_id, course_id):
# check whether the dept_id exists in your current dictonary
if dept_id in data_dict.keys():
# check whether the course_id exists in your current dictonary
if course_id in data_dict[dept_id].keys():
return data_dict[dept_id][course_id]
else:
print ('Invalid course id')
else:
print ('invalid department id')
print func('101', '10001')
答案 3 :(得分:0)
如果你真的想同时使用DeptID和CourseID,你似乎需要一个二维查找表(不是一个实际的Python内置的东西),首先查找可能DeptID(在字典中)会给你一个表(字典)CourseIDs与已注册的与该部门对应的号码配对。
有点低效,但在我看来,所有的课程ID都是独一无二的,如果是这样的话,您是否可以根据它进行查找?