質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

761閲覧

python dictのkeyの取り出し

Noisman

総合スコア14

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/09/09 06:53

編集2019/09/09 08:15

こんにちは、個別指導塾で担当する生徒を振り分けるコマ組みという作業をプログラミングを用いて少しでも楽にならないかと考え現在プログラムを書いていますが、つまずいてしまったので質問させていただきます。

大まかな構成は以下の通りです
前提: 生徒のデータベースには名前(student_name), 科目, 通塾曜日 が、
講師のデータベースには名前(teacher_name), 指導可能科目, 指導可能科目の優先度, シフトに入れる曜日 が登録されています。

  1. 登録したい曜日と時間を入力 -> データベースからその曜日のその時間に通塾する生徒を抽出
  2. 登録したい生徒とその生徒の科目を入力 -> データベースからその曜日のその時間にシフトが入っていてその科目を担当できる講師を抽出
  3. 抽出された講師のその科目の優先度を適当な式を用いて計算し、優先度が高い順に並び替える(配列(priority_sort)に優先度順に格納しておく)
  4. 講師の名前がkey,生徒の名前を入れるための配列をvalueとしたdict(relation)を用意する 

->3で用意した配列とdictのkeyを比べて名前が一致し、かつvalueの大きさが2より小さかったら(1:2の個別指導塾だから)生徒の名前を登録する
5. 2〜4を繰り替えす
6. 全て終わったらpdfに出力する

といったような構成で現在、4をうまく実装できずにでつまずいています。
[[講師1, 優先度高]
[講師4, 優先度中]
[講師2, 優先度中]
[講師3, 優先度低]
]
に生徒を登録する際に
{講師1:[生徒1,生徒2],講師4:[],講師2:[],講師3:[]}
まではうまくいくが、生徒3以降が講師4に登録されない点でつまずいています。
うまくいく方法があればご教授ください。

python

1#coding: utf-8 2import sqlite3 3import pprint 4import sys 5conn = sqlite3.connect("koma.db") 6c = conn.cursor() 7 8# コマを組みたい生徒を選ぶ 9def student_choice(c, date, time): 10 c.execute("select name from student where schedule like '%{}{}%' ".format(date, time,)) 11 print("---------------") 12 print("生徒を表示") 13 for row in c: 14 print(list(row)) 15 student_all.append(list(row)) 16 print("登録したい生徒を入力: ", end = "") 17 global student_name 18 student_name = input() 19 c.execute("select subject from student where name like ?; ", (student_name,)) 20 for row in c: 21 print(list(row)) 22 print("登録したい科目を入力: ", end = "") 23 global subject 24 subject = input() 25 26# 選んだ生徒を担当できる講師を探す 27def schedule(c, subject, date, time): 28 print("---------------") 29 print("担当可能講師を表示") 30 c.execute("select teacher.name, {} from teacher, teacher_schedule where teacher.name = teacher_schedule.name and {} > 0 and {}{} = 0" 31 .format(subject, subject, date, time,)) 32 global priority 33 priority = [] 34 for row in c: 35 #print(list(row)) 36 priority.append(list(row)) 37 38# 探した講師から優先順位を考慮して計算 39def priority_calculation(priority, relation, all_relation): 40 sum = 0 41 i = 0 42 while i < len(priority): 43 sum += priority[i][1] 44 i += 1 45 ave = sum / len(priority) 46 j = 0 47 while j < len(priority): 48 f = float(priority[j][1]/ave) - float(len(priority)/len(student_all)) 49 priority[j].append(f) 50 j += 1 51 #print(priority) 52 global priority_sort 53 priority_sort = sorted(priority, key = lambda x: x[2], reverse = True) 54 pprint.pprint(priority_sort, width = 40) 55 for row in priority_sort: 56 relation.setdefault(row[0], []) 57 #print(relation) 58 59 60def entry(priority_sort, relation, student_name): 61 i = 0 62 while i < len(priority_sort): 63 for k, v in relation.items(): 64 #print(k) 65 if priority_sort[i][0] == k: 66 if len(v) < 2: 67 v.append(student_name) 68 i += 1 69 break 70 print(relation) 71 72 73print("曜日を選択") 74print("月曜|火曜|水曜|木曜|金曜|土曜|日曜") 75date = input() 76 77print("---------------") 78print("時間を番号で選択") 79print("1. 10:40 ~ 12:00") 80print("2. 12:10 ~ 13:30") 81print("3. 14:00 ~ 15:20") 82print("4. 15:30 ~ 16:50") 83print("5. 17:20 ~ 18:40") 84print("6. 18:50 ~ 20:10") 85print("7. 20:20 ~ 21:40") 86time = str(input()) 87student_all = [] 88#priority = [] 89all_relation = [] 90relation = {} 91 92while True: 93 student_choice(c, date, time) 94 schedule(c, subject, date, time) 95 priority_calculation(priority, relation, all_relation) 96 entry(priority_sort, relation, student_name) 97 print("1: 同じ時間帯で登録する.") 98 print("2: この時間の登録を終了する.") 99 a = input() 100 if a == "1": 101 True 102 elif a == "2": 103 print("終了します.") 104 break 105

水曜の7の時間に多くの生徒を登録してあるので、水曜->7で実行してください

以下koma.db の 内容です
CREATE TABLE "student" (
"name" TEXT,
"year" TEXT,
"subject" TEXT,
"schedule" TEXT
)

csv

1name,year,subject,schedule 2竹内涼真,h3,"高校数学,高校化学","火曜7,水曜7" 3小栗旬,j3,"中学数学,中学理科,中学英語,中学国語,中学社会","木曜6,木曜7,金曜6,金曜7" 4新垣結衣,h2,"高校数学,高校英語,高校世界史","土曜6,土曜7" 5松坂桃李,j1,"中学数学,中学数学","火曜5,火曜6" 6本田翼,j3,"中学数学,中学英語","水曜7,木曜5,木曜6" 7戸田恵梨香,h1,"高校数学,高校英語,高校物理","水曜6,水曜7" 8宇垣美里,j2,"中学数学,中学英語","火曜7,水曜7,木曜7" 9福士蒼汰,j2,"中学数学,中学英語,中学理科","水曜6,水曜7,土曜6" 10山崎賢人,h1,高校数学,水曜7 11長澤まさみ,h1,"高校数学,高校英語","水曜7,金曜6,金曜7" 12石原さとみ,h1,"高校数学,高校英語",水曜7

CREATE TABLE "teacher" (
"name" TEXT,
"適正I" INTEGER,
"適正II" INTEGER,
"算国" INTEGER,
"中学数学" INTEGER,
"中学英語" INTEGER,
"中学国語" INTEGER,
"中学理科" INTEGER,
"中学社会" INTEGER,
"高校数学" INTEGER,
"高校物理" INTEGER,
"高校化学" INTEGER,
"高校生物" INTEGER,
"高校英語" INTEGER,
"高校国語" INTEGER,
"高校日本史" INTEGER,
"高校世界史" INTEGER,
"高校地理" INTEGER,
"高校倫政" INTEGER
)

csv

1name,適正I,適正II,算国,中学数学,中学英語,中学国語,中学理科,中学社会,高校数学,高校物理,高校化学,高校生物,高校英語,高校国語,高校日本史,高校世界史,高校地理,高校倫政 2櫻井翔,0,0,0,5,5,5,2,4,0,0,0,0,3,3,4,4,4,0 3相葉雅紀,3,3,3,5,5,5,3,0,5,4,5,5,0,0,0,0,0,0 4二宮和也,4,0,0,5,5,5,0,0,5,5,5,0,5,0,0,0,0,0 5松本潤,3,3,4,5,5,5,5,5,4,5,5,4,5,3,0,0,0,0 6大野智,2,2,1,4,4,5,5,3,2,0,2,1,2,0,4,3,4,3 7

CREATE TABLE "teacher_schedule" (
"name" TEXT,
"月曜1" INTEGER,
"月曜2" INTEGER,
"月曜3" INTEGER,
"月曜4" INTEGER,
"月曜5" INTEGER,
"月曜7" INTEGER,
"火曜1" INTEGER,
"火曜2" INTEGER,
"火曜3" INTEGER,
"火曜4" INTEGER,
"火曜5" INTEGER,
"火曜6" INTEGER,
"火曜7" INTEGER,
"水曜1" INTEGER,
"水曜2" INTEGER,
"水曜3" INTEGER,
"水曜4" INTEGER,
"水曜5" INTEGER,
"水曜6" INTEGER,
"水曜7" INTEGER,
"木曜1" INTEGER,
"木曜2" INTEGER,
"木曜3" INTEGER,
"木曜4" INTEGER,
"木曜5" INTEGER,
"木曜6" INTEGER,
"木曜7" INTEGER,
"金曜1" INTEGER,
"金曜2" INTEGER,
"金曜3" INTEGER,
"金曜4" INTEGER,
"金曜5" INTEGER,
"金曜6" INTEGER,
"金曜7" INTEGER,
"土曜1" INTEGER,
"土曜2" INTEGER,
"土曜3" INTEGER,
"土曜4" INTEGER,
"土曜5" INTEGER,
"土曜6" INTEGER,
"土曜7" INTEGER,
"日曜1" INTEGER,
"日曜2" INTEGER,
"日曜3" INTEGER,
"日曜4" INTEGER,
"日曜5" INTEGER,
"日曜6" INTEGER,
"日曜7" INTEGER
)

csv

1name,月曜1,月曜2,月曜3,月曜4,月曜5,月曜7,火曜1,火曜2,火曜3,火曜4,火曜5,火曜6,火曜7,水曜1,水曜2,水曜3,水曜4,水曜5,水曜6,水曜7,木曜1,木曜2,木曜3,木曜4,木曜5,木曜6,木曜7,金曜1,金曜2,金曜3,金曜4,金曜5,金曜6,金曜7,土曜1,土曜2,土曜3,土曜4,土曜5,土曜6,土曜7,日曜1,日曜2,日曜3,日曜4,日曜5,日曜6,日曜7 2櫻井翔,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,0,0,1,1,1,1,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1 3相葉雅紀,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1 4二宮和也,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1 5松本潤,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,1,1,0,0,0,0,0,1,1,1,1,1,1,1 6大野智,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,1,1,1,1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tiitoi

2019/09/09 07:34

変数 sp はどのような中身になっているのでしょうか。 データは実際のものでなくサンプルでいいので、コピペして動作するコード全体を追記していただけますか。
LouiS0616

2019/09/09 07:34

変数spが一体なんなのか分からないです。
Noisman

2019/09/09 07:37

すいません spはpriority_sortです。修正しておきます
Noisman

2019/09/09 08:16

冗長になりましたがデータベースの内容や、pythonのコード全体を追加しておきました。ご回答よろしくお願いします。
tiitoi

2019/09/09 08:22

entry 関数の while の最後に break があるので、実質的に while 文内は1回じか実行されないようになってますが、これは意図通りでしょうか?
Noisman

2019/09/09 08:33 編集

breakがないと {講師1:[生徒1],講師4:[生徒1],講師2:[生徒1],講師3:[生徒1]} のように全ての講師に生徒1が登録されてしまったので、意図的にbreakを入れています。 ただ言われてみると、breakがあるとwhileが一回しか回らないことになるので改良した方が良さそうですね・・・
tiitoi

2019/09/09 08:44

その関数内のロジックがおかしいと思います。 while は一回しか回らないため、常に priority_sort[0][0] == k の比較しか行われないため、講師1にしか生徒が登録できません。
guest

回答1

0

ベストアンサー

空きがある講師を探して、リストに追加する場合、以下のようにすればいいのではないでしょうか。

python

1def entry(priority_sort, relation, student_name): 2 for teacher_name, priority in priority_sort: 3 students = relation[teacher_name] # 講師 teacher_name に登録されている生徒一覧 4 5 if len(students) < 2: 6 # 空きがある講師が見つかった場合、追加して関数を抜ける。 7 students.append(student_name) 8 return 9 10 11relation = {"講師1": [], "講師2": [], "講師3": [], "講師4": []} 12priority_sort = [["講師1", "優先度高"], ["講師4", "優先度中"], ["講師2", "優先度中"], ["講師3", "優先度低"]] 13 14entry(priority_sort, relation, "生徒1") 15entry(priority_sort, relation, "生徒2") 16entry(priority_sort, relation, "生徒3") 17entry(priority_sort, relation, "生徒4") 18print(relation) 19# {'講師1': ['生徒1', '生徒2'], '講師2': [], '講師3': [], '講師4': ['生徒3', '生徒4']}

補足

表データを利用するコードの作成は pandas を使うことをおすすめします。

投稿2019/09/09 08:42

編集2019/09/09 08:47
tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Noisman

2019/09/09 09:06

ありがとうございます。無事に実装できました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問