2017-05-29 12 views
5

これはStackOverflowに関する私の最初の質問です。私は非常に多くのウェブサイトを検索しましたが、探していたものが見つからなかった(または気付いていませんでした)。私を落胆させないでください:)Python:索引作成にDictionaryを使用できますか?

また、これは私の最初のプログラミング経験であり、私は混乱しています。

私はTXTファイルを持っていて、その中にWhiteSpacesで区切られた3つの列があります。これらの列はDeptID,CourseID,NumberofStudentsEnrolledです。ここで

はサンプルデータです:私はDeptID指標とCourseIDインデックスを呼び出すたびので

101 10001 23 
102 10002 30 
102 10004 5 
102 10005 13 
105 10006 59 
105 10007 77 

、プログラムは私に在籍学生数を与えます。

例:は、回答として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

私は 'dataframes'と' pandas'を調べることをお勧めします –

+1

これはnumpyを使用できませんか? –

+3

これは辞書の辞書で簡単に行うことができます。ヘビーウェイト( 'numpy'や' pandas')の解決策は必要ありません – donkopotamus

答えて

7

あなたが簡単に辞書の辞書にデータを読み取ることができます。

data = {} 
for line in file: 
    dept, course, num_students = line.split() 
    data.setdefault(dept, {})[course] = int(num_students) 

今あなたがルックアップすることができます。

>>> data["101"]["10001"] 
23 
+0

これは完全にうまくいきます。ありがとうございました。 –

0

をあなたが本当にしたいDEPTIDとCourseIDの両方を使用している場合、あなたが必要と思われます2次元ルックアップテーブル(実際のPython組み込みのものではありません)では、DeptID(辞書内)を最初に検索すると、Departmentに対応する登録番号とペアになったCourseIDのテーブル(辞書)が表示されます。

効率的ではありませんが、すべてのCourseIDがユニークになるように見えますが、そうであれば、それに基づいてルックアップを行うことは可能でしょうか?

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

申し訳ありませんが、私はフィトンで新しいです:) そうですね。 'depts [(i、j)] –

+0

芽のために謝るべきことは何もありません。将来的にPythonを使う予定があるなら、Oreillyがpythonの料理本のコピーを手に入れたいかもしれません。それは多くの人々を助け、私の意見ではかなり良い読書です。 – FredMan

+0

ありがとう@フレッドマン。 私はdepts [(i、j)]のようなことをすることができますか? –

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

ありがとうございます@Abhinav –

+0

これは現在間違っています、 'data_dict [row [0]] = {row [1]:row [2]}'は 'row [0] ] 'ではなく、新しいデータを追加します。 – donkopotamus

+0

@donkopotamusそれを指摘してくれてありがとう。私は今それを修正しました。 –

関連する問題