需求是这样的,我有一个大陆省份的列表:
region_list=['北京市','天津市','河北省','山西省','内蒙古自治区','辽宁省','吉林省','黑龙江省','上海市'
,'江苏省','浙江省','安徽省','福建省','江西省','山东省','河南省','湖北省','湖南省'
,'广东省','广西壮族自治区','海南省','重庆市','四川省','贵州省','云南省','西藏自治区','陕西省'
,'甘肃省','青海省','宁夏回族自治区','新疆维吾尔自治区']
以及一个csv文件记录了大陆的每个院校,需要将院校和对应的省份关联起来存入数据库。这份名单在这里http://www.moe.gov.cn/jyb_xxgk/s5743/s5744/202007/t20200709_470937.html下载,但是需要先转存为csv文件读入,并且后续人为做一些删除工作。
比较烦的一点是主管部门五花八门,有省级单位、有卫健委、工信部等等,无法从此字段判断所在省级行政单位,逻辑上也不好控制。而所在地太细到了市级单位,因此想到的一个办法是对着csv文件根据省级行政区划端点,根据断点分区对应region_list来重新生成院校省市信息的list,
经过对着csv文件一番仔细比对,我得出的断点列表如下:
break_point=[0,91,147,272,357,411,527,591,671,734,901,1010,1130,1219,1324,1476,1627,1756,1884
,2038,2120,2141,2209,2341,2416,2498,2505,2601,2651,2663,2683,2739]
其中0~91代表北京市的院校,91~147是天津市的院校,根据region_list依次往下推。假设有两列表list1=[a1,a2,a3,……],list2=[b1,b2,b3,……],定义两列表的内积为,而字符串乘以整数如'北京市'*2='北京市','北京市',现在需要做的就是对break_point列表做差分,然后对其和region_list做内积
差分操作的代码如下:
diff=[break_point[i+1]-break_point[i] for i in range(len(break_point)-1)]
#得到的结果为[91, 56, 125, 85, 54, 116, 64, 80, 63, 167, 109, 120, 89, 105, 152, 151, 129,
# 128, 154, 82, 21, 68, 132, 75, 82, 7, 96, 50, 12, 20, 56]
尝试了以下用" ".join()操作,遗憾的是结果错误。
region_list_final=','.join(str([region_list[i] for _ in range(diff[i])]) for i in range(len(diff)))
测试的代码为:
print('列表中北京市的个数为:%d'%region_list_final.count('北京市'))
#91
print('列表中天津市的个数为:%d'%region_list_final.count('天津市'))
#56
列表中各个省级院校的总数没有问题,但是顺序却存在问题,我们可以检测一下:
print(region_list_final[0:91].count('北京市'))
#13
print(region_list_final[91:147].count('天津市'))
#0
很令人疑惑,反复检验直到我检测了一下region_list_final的类型发现它是str类型,上述检测代码的切片是依据单个字符做的操作,这就不奇怪了,这也给我加深了一下印象:" ".join()操作后的类型都是字符串,下次使用需要小心了哈
因此,要把" ".join()转变为列表操作,代码变化的代码很相似:
region_list_final=[[region_list[i] for _ in range(diff[i])] for i in range(len(diff))]
得到的结果完全正确:
和diff前两个元素的值一致。