stems_to_groups.py 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495
  1. #!/usr/bin/env/python
  2. # -*- coding:utf-8 -*-
  3. import re
  4. from pprint import pprint
  5. def regroup(res_list, item_groups, ans_groups):
  6. """
  7. 将多个题共用一个题干的情况进行slave重组,如地理
  8. item_groups中的groups_data,key值表示带公共题干的试题位置,从0开始计;
  9. value值:'fei'表示本题不是小题多问;
  10. '\d-\d'表示哪几个题合成slave;
  11. ''空表示带公共题干试题开始位置,没有slave范围
  12. 例:item_groups: {'is_groups': 1, 'groups_data':
  13. {0: 'fei', 5: '', 8: '', 11: 'fei', 12: '', 15: '', 19: '20-21', 23: 'fei'}}
  14. :param res_list:
  15. :param item_groups:
  16. :param ans_groups:
  17. :return:
  18. """
  19. new_res_dict = []
  20. groups_data = item_groups["groups_data"]
  21. start_no = list(groups_data.keys()) # 与真实题号差1
  22. start_no.sort() # 排序
  23. def takefirst(elem):
  24. return int(elem.split("-")[0])
  25. ans_start_no = []
  26. if ans_groups:
  27. ans_start_no = list(ans_groups.keys())
  28. ans_start_no.sort(key=takefirst) # 排序
  29. contained_no = [] # 答案参与重组的题号
  30. for ans_no in ans_start_no:
  31. st1, ed1 = ans_no.split("-")
  32. contained_no.extend(list(range(int(st1)-1, int(ed1))))
  33. not_contained_no = set(range(len(res_list))) - set(contained_no) # 不严格,题号不一定从1开始
  34. added_nos = [] # 已经slave了的真实题号
  35. # 开始是单层题型结构时
  36. temp_no = -1
  37. while groups_data and groups_data[start_no[0]] == "fei":
  38. if start_no[0] - temp_no == 1:
  39. new_res_dict.append(res_list[start_no[0]])
  40. elif start_no[0] - temp_no > 1:
  41. new_res_dict.extend(res_list[temp_no+1: start_no[0]+1])
  42. temp_no = start_no[0]
  43. del start_no[0]
  44. if start_no[0] > 0:
  45. new_res_dict.extend(res_list[temp_no+1:start_no[0]])
  46. one_group = {}
  47. alone_item_nos = []
  48. print("start_no:", start_no)
  49. fei_no = {}
  50. for n, group_no in enumerate(start_no):
  51. # print("added_nos:", added_nos, group_no)
  52. if "com_stem" not in res_list[group_no]: # 不带"com_stem"
  53. if group_no == start_no[-1] and groups_data[group_no] == "fei": # 最后一个不管
  54. continue
  55. if groups_data[group_no] == "fei": # 可能存在多个fei
  56. if n - 1 in fei_no:
  57. new_res_dict.extend(res_list[fei_no[n - 1] + 1: group_no + 1])
  58. else:
  59. new_res_dict.append(res_list[group_no])
  60. added_nos.append(group_no+1)
  61. fei_no[n] = group_no
  62. continue
  63. # 其他情况,须是独立的题号
  64. if not "#" + str(group_no + 1) + "-" in "#" + "#".join(ans_groups.keys()):
  65. new_res_dict.append(res_list[group_no])
  66. added_nos.append(group_no+1)
  67. # continue
  68. else:
  69. # 遇到带"com_stem"的试题
  70. one_group["com_stem"] = res_list[group_no]["com_stem"]
  71. del res_list[group_no]["com_stem"]
  72. if "-" in groups_data[group_no]: # slave范围知道时
  73. st, end = groups_data[group_no].split("-")
  74. if not added_nos: # 开始
  75. if n + 1 < len(start_no) and start_no[n + 1] <= int(end): # 公共题文中的结束序号信息有误,以下一个题的key值为主
  76. one_group["slave"] = res_list[int(st) - 1: start_no[n + 1]]
  77. added_nos.append(start_no[n + 1])
  78. else:
  79. added_nos.append(int(end))
  80. if len(res_list) < int(end):
  81. st = int(st) - int(res_list[0]["topic_num"]) + 1
  82. end = int(end) - int(res_list[0]["topic_num"]) + 1
  83. one_group["slave"] = res_list[int(st) - 1:int(end)]
  84. elif int(st) <= added_nos[-1]: # 公共题文中的初始序号信息有误
  85. if n + 1 < len(start_no): # 不是最后一组
  86. if int(end) < start_no[n + 1]:
  87. one_group["slave"] = res_list[added_nos[-1]:int(end)]
  88. added_nos.append(int(end))
  89. else: # 结束序号有误,
  90. one_group["slave"] = res_list[added_nos[-1]: start_no[n + 1]]
  91. added_nos.append(start_no[n + 1])
  92. else:
  93. if int(end) >= added_nos[-1]:
  94. one_group["slave"] = res_list[added_nos[-1]:int(end)]
  95. added_nos.append(int(end))
  96. else: # end值出错
  97. if str(group_no+1) + "-" in "#".join(ans_groups.keys()):
  98. # 修改20240621
  99. # end = re.search("[^#]{}-(\d+)[$#]".format(group_no), "#".join(ans_groups.keys())).group(1)
  100. # one_group["slave"] = res_list[group_no: int(end) + 1]
  101. end_info1 = re.search(r"#{}-(\d+)($|#)".format(group_no+1), "#".join(ans_groups.keys()))
  102. end_info2 = re.search(r"[^#]{}-(\d+)($|#)".format(group_no), "#".join(ans_groups.keys()))
  103. if end_info1:
  104. end = end_info1.group(1)
  105. one_group["slave"] = res_list[group_no: int(end)]
  106. added_nos.append(int(end))
  107. elif end_info2: #????
  108. end = end_info2.group(1)
  109. one_group["slave"] = res_list[group_no: int(end) + 1]
  110. added_nos.append(int(end)+1)
  111. else:
  112. one_group["slave"] = []
  113. else:
  114. endp = [m for m, j in enumerate(res_list[added_nos[-1]:])
  115. if j["type"] != res_list[added_nos[-1]]["type"]]
  116. if endp:
  117. one_group["slave"] = res_list[added_nos[-1]:endp[0] + len(res_list[:added_nos[-1]])]
  118. added_nos.append(endp[0] + len(res_list[:added_nos[-1]]))
  119. else:
  120. one_group["slave"] = res_list[group_no:]
  121. else:
  122. added_nos.append(int(end))
  123. one_group["slave"] = res_list[int(st) - 1:int(end)]
  124. if int(st) > added_nos[-1] + 1:
  125. new_res_dict.extend(res_list[added_nos[-1]:int(st) - 1])
  126. # 2024.9.10补充
  127. if n+1 < len(start_no) and int(end) < start_no[n+1]: # 中间单独的题目
  128. alone_item_nos.append([int(end), start_no[n + 1]])
  129. added_nos.append(start_no[n + 1])
  130. else: # salve范围不知道时
  131. # print("yyy:", group_no, start_no, groups_data)
  132. if group_no != start_no[-1]: # 不是最后一个
  133. if groups_data[group_no] == "fei": # 可能存在多个fei
  134. if n - 1 in fei_no:
  135. new_res_dict.append(res_list[fei_no[n-1]+1: group_no+1])
  136. else:
  137. new_res_dict.append(res_list[group_no])
  138. added_nos.append(group_no+1)
  139. fei_no[n] = group_no
  140. continue
  141. elif "#" + str(group_no + 1) + "-" in "#" + "#".join(ans_groups.keys()): # 以答案的序号为准
  142. aa = ("#" + "#".join(ans_groups.keys())).split("#{}-".format(group_no + 1))
  143. end = aa[-1].split("#", maxsplit=1)[0]
  144. one_group["slave"] = res_list[group_no: int(end)]
  145. added_nos.append(int(end))
  146. if int(end) < start_no[n+1]: # 中间单独的题目
  147. alone_item_nos.append([int(end), start_no[n + 1]])
  148. added_nos.append(start_no[n + 1])
  149. # new_res_dict.extend(res_list[int(end)+1:])
  150. else:
  151. one_group["slave"] = res_list[group_no: start_no[n+1]]
  152. added_nos.append(start_no[n+1])
  153. else:
  154. if groups_data[group_no] == "fei":
  155. continue
  156. elif "#{}-".format(group_no + 1) in "#" + "#".join(ans_groups.keys()): # 以答案的序号为准
  157. aa = ("#" + "#".join(ans_groups.keys())).split("#{}-".format(group_no + 1))
  158. end = aa[-1].split("#", maxsplit=1)[-1]
  159. one_group["slave"] = res_list[group_no: int(end)]
  160. added_nos.append(int(end))
  161. else:
  162. # 只根据题型来判断截止点,不靠谱,先按作答类型
  163. endp = []
  164. if added_nos:
  165. endp = [m for m, j in enumerate(res_list[added_nos[-1]:]) if "answer_type" in j and
  166. "作文" in j["answer_type"] and j["answer_type"] != res_list[added_nos[-1]]["answer_type"]]
  167. if not endp or (endp[0] <= 1 and len(res_list[added_nos[-1]:]) > 6) or endp[0] > 6: # 默认最多小题是6个
  168. endp = [m for m, j in enumerate(res_list[added_nos[-1]:]) if "answer_type" in j
  169. and "answer_type" in res_list[added_nos[-1]] and
  170. j["answer_type"] != res_list[added_nos[-1]]["answer_type"]]
  171. # print("endp:", endp, )
  172. if endp and endp[0] > 1:
  173. one_group["slave"] = res_list[added_nos[-1]:endp[0] + len(res_list[:added_nos[-1]])]
  174. added_nos.append(endp[0] + len(res_list[:added_nos[-1]]))
  175. # new_res_dict.extend(res_list[added_nos[-1]:])
  176. else:
  177. one_group["slave"] = res_list[group_no:]
  178. added_nos.append(len(res_list))
  179. one_group["type"] = one_group["slave"][0]["type"] if one_group["slave"] else ""
  180. one_group["que_num"] = len(one_group["slave"])
  181. if one_group["slave"]:
  182. if one_group["slave"][-1]["topic_num"] != one_group["slave"][0]["topic_num"]:
  183. one_group["topic_num"] = "{}-{}".format(one_group["slave"][0]["topic_num"],
  184. one_group["slave"][-1]["topic_num"])
  185. else:
  186. one_group["topic_num"] = one_group["slave"][0]["topic_num"]
  187. else:
  188. one_group["topic_num"] = ""
  189. # ---------小题答案拆分----------
  190. one_group = ans_regroup(ans_start_no, one_group, ans_groups)
  191. if "key" not in one_group:
  192. one_group["key"] = ""
  193. if "parse" not in one_group:
  194. one_group["parse"] = ""
  195. new_res_dict.append(one_group)
  196. if alone_item_nos: # 把中间单独的不参与重组的题目也加上
  197. for alone_no in alone_item_nos:
  198. new_res_dict.extend(res_list[alone_no[0]: alone_no[1]])
  199. alone_item_nos = []
  200. one_group = {}
  201. # 把末尾不参与重组的题目也加上
  202. if added_nos[-1] < len(res_list):
  203. new_res_dict.extend(res_list[added_nos[-1]:])
  204. # ---------------------题目重组end----------------------------------
  205. if not_contained_no: # 答案不参与重组的题号
  206. for one_no in not_contained_no:
  207. for idx, one_res in enumerate(new_res_dict):
  208. if one_no+1 == one_res["topic_num"]:
  209. parse_split2group(one_res)
  210. # ------对重组后的每个大题更新题型结构,并对公共题文初步添加缩进-------
  211. for one_res in new_res_dict:
  212. if "com_stem" in one_res: # 公共题文中暂不考虑填空个数
  213. # 添加缩进属性<p style="text-indent: 2em">、居中属性<p style="text-align:center">
  214. # new_com_stem = suojin(one_res["com_stem"])
  215. new_com_stem = one_res["com_stem"]
  216. new_com_stem = re.sub(r"(完成|回答)下?[面列]?的?第?(\d{1,2})[-到至第~~-]+?(\d{1,2})小?题",
  217. r"\1下面小题", new_com_stem)
  218. new_com_stem = new_com_stem.replace(" ", "&nbsp;&nbsp;") # 允许手动调整的空格保留
  219. # 字体设置:带缩进的行均设置为楷体,其他是宋体
  220. new_com_stem = re.sub(r'(<p style="text-indent:.*?">\n*|<p style="text-align: center;?">\n*'
  221. r'|<p style="text-align: right;?">\n*)([^\n]+?)', r'\1<span style="font-family:楷体;">\2',
  222. new_com_stem)
  223. one_res["stem"] = new_com_stem + "\n" + one_res["stem"] if "stem" in one_res else new_com_stem
  224. del one_res["com_stem"]
  225. elif "slave" in one_res and one_res["slave"] and "stem" in one_res: # 带小问的试题题文也设置一下字体
  226. lw_com_stem = re.sub(r'(<p style="text-indent:.*?">\n*|<p style="text-align: center;?">\n*'
  227. r'|<p style="text-align: right;?">\n*)([^\n]+?)', r'\1<span style="font-family:楷体;">\2',
  228. one_res["stem"])
  229. one_res["stem"] = lw_com_stem
  230. one_res["topic_num"] = str(one_res["topic_num"])
  231. if "slave" in one_res:
  232. one_res['type'] = '小题多问类'
  233. elif "options" in one_res:
  234. one_res['type'] = '选择类'
  235. else:
  236. one_res['type'] = '解答类'
  237. if re.search("(阅读|针对|结合).{,4}[资材]料|(\n|^)\s*材料一\s", one_res['stem']):
  238. one_res["stem"] = re.sub(r'(<p style="text-indent:.*?">\n*|<p style="text-align: center;?">\n*'
  239. r'|<p style="text-align: right;?">\n*)([^\n]+?)',
  240. r'\1<span style="font-family:楷体;">\2',
  241. one_res["stem"])
  242. # ind_label = '<p style="text-indent: 2em">'
  243. # if "【范文】" in one_res['key']: # "写作"
  244. # anss = re.split("\n+", one_res['key'])
  245. # ids = [n for n, a in enumerate(anss) if "【范文】" in a][0]
  246. # may_title = anss[ids].replace("【范文】", "").strip()
  247. # if not may_title:
  248. # ids += 1
  249. # may_title = anss[ids].strip()
  250. # if 0 < len(may_title) < 5:
  251. # new_ans = "\n".join(anss[:ids]) + '<p style="text-align:center">' + anss[ids] + "</p>" \
  252. # + ind_label + ('</p>' + ind_label).join(anss) + "</p>"
  253. # else:
  254. # new_ans = ind_label + '</p><p style="text-indent: 2em">'.join(anss) + "</p>"
  255. # one_res['key'] = new_ans
  256. # elif re.search(r"(阅读|针对).{,4}[资材]料|(\n|^)\s*材料一\s", one_res['stem']) \
  257. # and "text-indent: 2em" not in one_res['stem']:
  258. # one_res['stem'] = suojin(one_res['stem'])
  259. return new_res_dict
  260. def ans_regroup(ans_start_no, one_group, ans_groups):
  261. """
  262. 答案重组
  263. ans_start_no:ans_groups中的题号组
  264. :return:
  265. """
  266. if ans_start_no:
  267. for k in ans_start_no:
  268. if k == one_group["topic_num"]:
  269. st1, end1 = k.split("-") # 真实题号组
  270. # --------------------------解析----------------------------
  271. parse_list = []
  272. if len(re.findall("【详解】", ans_groups[k]["parse"])) > 1:
  273. parse_list = re.split("【详解】", ans_groups[k]["parse"])
  274. comm_parse, parse_list = parse_list[0], parse_list[1:]
  275. else:
  276. t_seq_no = list(range(int(st1), int(end1) + 1))
  277. t_seq_no = list(map(str, t_seq_no))
  278. if any([True if len(no) > 1 else False for no in t_seq_no]):
  279. parse_list = re.split(r"(?<=[】\n])\s*(" + "|".join(t_seq_no) + r")\s*[、..、]",
  280. "\n" + ans_groups[k]["parse"])
  281. comm_parse, parse_list = parse_list[0], parse_list[1:]
  282. parse_list = [pr for idn, pr in enumerate(parse_list) if idn % 2 == 1]
  283. else:
  284. parse_list = re.split(r"(?<=[】\n])\s*[" + "".join(t_seq_no) + r"]\s*[、..、]",
  285. "\n" + ans_groups[k]["parse"])
  286. comm_parse, parse_list = parse_list[0], parse_list[1:]
  287. if len(parse_list) > 1:
  288. if len(parse_list) == int(end1) + 1 - int(st1):
  289. if comm_parse:
  290. one_group["parse"] = comm_parse
  291. for i in range(len(parse_list)):
  292. pr = parse_list[i].strip()
  293. if i == len(parse_list) - 1 and re.search("\n\s*[【参考]*?译文\s*[】::]|\n\s*【点睛】", pr):
  294. pr, hd, one_group["parse"] = re.split("\n\s*([【参考]*?译文\s*[】::]|【点睛】)",
  295. pr, maxsplit=1)
  296. one_group["parse"] = hd + one_group["parse"]
  297. one_group["slave"][i]["parse"] = pr
  298. if "slave" in one_group["slave"][i]: # 解析再拆-->小问解析
  299. slave_parse_list = re.split("(?<=[\s\n])[((]\s*\d{1,2}[))]", "\n" + pr)
  300. if len(slave_parse_list) - 1 == len(one_group["slave"][i]["slave"]):
  301. for pi in range(len(slave_parse_list) - 1):
  302. one_group["slave"][i]["slave"][pi]["parse"] = slave_parse_list[pi + 1].strip()
  303. one_group["slave"][i]["parse"] = slave_parse_list[0].strip()
  304. else:
  305. # 就将各题解析合在一起
  306. one_group["parse"] = ans_groups[k]["parse"]
  307. else:
  308. one_group['parse'] = ans_groups[k]["parse"]
  309. # --------------------------答案----------------------------
  310. ans_list = re.split("(?<=[】\n])\d{1,2}\s*[、..、]|\s{2,}\d{1,2}\s*[、..、]|(?<=[A-E])\s*\d{1,2}\s*[、..、]",
  311. "\n" + ans_groups[k]["key"])[1:]
  312. if len(ans_list) > 1:
  313. if len(ans_list) == int(end1) + 1 - int(st1):
  314. for j in range(len(ans_list)):
  315. one_group["slave"][j]["key"] = ans_list[j].strip()
  316. if "slave" in one_group["slave"][j]: # 答案再拆
  317. slave_ans = re.sub(r"([((]\s*\d\s*[))])\s*[、..、,,::]\s*\1", r"\1", ans_list[j])
  318. slave_ans_list = re.split("(?<=[\s\n])[((]\s*\d{1,2}[))]", "\n" + slave_ans.strip())
  319. if len(slave_ans_list) - 1 == len(one_group["slave"][j]["slave"]):
  320. for aj in range(len(slave_ans_list) - 1):
  321. one_group["slave"][j]["slave"][aj]["key"] = slave_ans_list[aj + 1].strip()
  322. one_group["slave"][j]["key"] = slave_ans_list[0].strip()
  323. else:
  324. one_group["key"] = ans_groups[k]["key"]
  325. # ans_start_no.remove(k)
  326. # break
  327. else:
  328. one_group['key'] = ans_groups[k]["key"]
  329. # 先暂时不去掉
  330. # for si, s in enumerate(one_group["slave"]):
  331. # if "errmsgs" in s:
  332. # del one_group["slave"][si]["errmsgs"]
  333. else: # ans_groups为空时
  334. # 针对答案在后面且【答案】1.xx 2.xx \n【解析】1.xx 2.xx \n【答案】3.xx 4.xx \n【解析】3.xx 4.xx
  335. # 或1.xx 2.xx \n【解析】1.xx 2.xx \n 3.xx 4.xx \n【解析】3.xx 4.xx
  336. if (one_group["slave"][0]["parse"] in ["略", ""] or one_group["slave"][0]["key"] in ["略", "", "见解析"]) \
  337. and ("-"in str(one_group["topic_num"]) and len(one_group["slave"]) > 1
  338. and one_group["slave"][-1]["parse"].strip()):
  339. st1, end1 = one_group["topic_num"].split("-") # 真实题号组
  340. t_seq_no = list(range(int(st1), int(end1) + 1))
  341. t_seq_no = list(map(str, t_seq_no))
  342. parse_list = re.split(r"(?<=[】\n])\s*(" + "|".join(t_seq_no) + r")\s*[、..、]",
  343. "\n" + one_group["slave"][-1]["parse"])
  344. comm_parse, parse_list = parse_list[0], parse_list[1:]
  345. parse_list = [pr.strip() for idn, pr in enumerate(parse_list) if idn % 2 == 1]
  346. if len(parse_list) in [int(end1) + 1 - int(st1), int(end1) - int(st1)]:
  347. if comm_parse:
  348. one_group["parse"] = comm_parse
  349. for ni, pr in enumerate(parse_list):
  350. if ni == int(end1) - int(st1): # 最后一个
  351. pr = re.sub("\n\s*【答案】$", "", pr)
  352. if re.search("\n\s*[【参考]*?译文\s*[】::]|\n\s*【点睛】", pr):
  353. pr, hd, one_group["parse"] = re.split("\n\s*([【参考]*?译文\s*[】::]|【点睛】)",
  354. pr, maxsplit=1)
  355. one_group["parse"] = hd + one_group["parse"]
  356. if one_group["slave"][ni]["key"] in ["略", "", "见解析"]:
  357. one_group["slave"][ni]["key"] = one_group["slave"][ni]["parse"]
  358. one_group["slave"][ni]["parse"] = pr
  359. return one_group
  360. def suojin(item_str):
  361. """
  362. 文本缩进处理
  363. :param item_str:
  364. :return:
  365. """
  366. ind_label = '<p style="text-indent: 2em">'
  367. con_list = re.split("\n+", item_str.strip())
  368. if len(con_list) > 1 and re.search("(阅读|针对).{,4}[资材]料", con_list[0]):
  369. new_con = con_list[0] + ind_label + ('</p>' + ind_label).join(con_list[1:]) + "</p>"
  370. else:
  371. new_con = ind_label + ('</p>' + ind_label).join(con_list) + "</p>"
  372. new_con = re.sub(r'<p style="text-indent: 2em">(\s*<img .+?)</p>($|<p style="text-indent: 2em">)',
  373. r'\1\n\2', new_con, flags=re.S).strip()
  374. return new_con
  375. def parse_split2group(item_list):
  376. """
  377. 有slave的题目将外层的解析拆入salve中
  378. :return:
  379. """
  380. # print(item_list)
  381. raw_item_list = item_list.copy()
  382. flag = 0
  383. # print(item_list)
  384. if "com_stem" in item_list and "slave" in item_list and len(item_list["slave"]) == 1: # 嵌套
  385. item_list = item_list["slave"][0]
  386. flag = 1
  387. if "slave" in item_list and (item_list["key"] or item_list["parse"]) and \
  388. any([True if not (s["key"] + s["parse"]).strip() else False for s in item_list["slave"]]):
  389. # 解析
  390. parse_list = re.split(r"(?<=[\s\n】])[((]\s*[\dl]{1,2}\s*[))]", "\n" + item_list["parse"].strip())
  391. if len(parse_list) - 1 == len(item_list["slave"]):
  392. for pi in range(len(parse_list) - 1):
  393. item_list["slave"][pi]["parse"] = parse_list[pi + 1].strip()
  394. item_list["parse"] = parse_list[0].strip()
  395. # 答案
  396. ans = re.sub(r"([((]\s*\d\s*[))])\s*[、..、,,::]\s*(\1)", r"\2", item_list["key"])
  397. ans_list = re.split("(?<=[\s\n】])[((]\s*[\dl]{1,2}\s*[))]", "\n" + ans.strip())
  398. if len(ans_list) - 1 == len(item_list["slave"]):
  399. for aj in range(len(ans_list) - 1):
  400. item_list["slave"][aj]["key"] = ans_list[aj + 1].strip()
  401. item_list["key"] = ans_list[0].strip()
  402. # 2021-12-21
  403. if "com_stem" in item_list:
  404. item_list["stem"] = item_list["com_stem"].strip() + "<br/>" + item_list["stem"] \
  405. if "stem" in item_list else item_list["com_stem"]
  406. del item_list["com_stem"]
  407. if flag:
  408. raw_item_list["slave"] = [item_list]
  409. item_list = raw_item_list
  410. return item_list
  411. def regroup_old(res_list, item_groups):
  412. """
  413. 将多个题共用一个题干的情况进行slave重组,如地理
  414. :param res_list: 拆分为小题后的结果
  415. :return:
  416. """
  417. new_res_dict = []
  418. start_no = [i for i in item_groups.keys() if i != "pos"]
  419. if not start_no:
  420. return res_list
  421. def takefirst(elem):
  422. return int(elem.split("-")[0])
  423. start_no.sort(key=takefirst) # 排序
  424. print(start_no)
  425. one_group = {}
  426. added_nos = [] # 已经slave了的题号
  427. for n, group_no in enumerate(start_no):
  428. one_group["common_stem"] = item_groups[group_no]
  429. st, end = group_no.split("-") # 真实题号组
  430. if not added_nos: # 开始
  431. if item_groups["pos"][n + 1] <= int(end): # 公共题文中的结束序号信息有误
  432. one_group["slave"] = res_list[int(st) - 1:item_groups["pos"][n + 1] - 1]
  433. added_nos.append(item_groups["pos"][n + 1] - 1)
  434. else:
  435. added_nos.append(int(end))
  436. one_group["slave"] = res_list[int(st) - 1:int(end)]
  437. elif int(st) <= added_nos[-1]: # 公共题文中的初始序号信息有误
  438. if n + 1 < len(item_groups["pos"]): # 不是最后一组
  439. if int(end) < item_groups["pos"][n + 1]:
  440. one_group["slave"] = res_list[added_nos[-1]:int(end)]
  441. added_nos.append(int(end))
  442. else: # 结束序号有误,以pos为主
  443. one_group["slave"] = res_list[added_nos[-1]:item_groups["pos"][n + 1] - 1]
  444. added_nos.append(item_groups["pos"][n + 1] - 1)
  445. else:
  446. if int(end) >= added_nos[-1]:
  447. one_group["slave"] = res_list[added_nos[-1]:int(end)]
  448. added_nos.append(int(end))
  449. else: # end值出错
  450. endp = [m for m, j in enumerate(res_list[added_nos[-1]:])
  451. if j["type"] != res_list[added_nos[-1]]["type"]]
  452. if endp:
  453. one_group["slave"] = res_list[added_nos[-1]:endp[0] + len(res_list[:added_nos[-1]])]
  454. added_nos.append(endp[0] + len(res_list[:added_nos[-1]]))
  455. else:
  456. added_nos.append(int(end))
  457. one_group["slave"] = res_list[int(st) - 1:int(end)]
  458. if int(st) > added_nos[-1] + 1:
  459. new_res_dict.extend(res_list[added_nos[-1]:int(st) - 1])
  460. one_group["type"] = one_group["slave"][0]["type"]
  461. one_group["que_num"] = len(one_group["slave"])
  462. new_res_dict.append(one_group)
  463. one_group = {}
  464. if added_nos[-1] < len(res_list):
  465. new_res_dict.extend(res_list[added_nos[-1]:])
  466. return new_res_dict