利用python一行代码搞定对字符串列表和整数列表做内积

需求是这样的,我有一个大陆省份的列表:

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,……],定义两列表的内积为inner\_product(list1,list2)=[a1*b1,a2*b2,a3*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前两个元素的值一致。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值