本帖最后由 Python初学者8号 于 2021-9-26 08:54 编辑
3.统计输入物体的类别——数量键值对,并排序
这个是我做二级py做出来的,我发现这个是一个套路的题目,人家的方法更加巧妙,可以学习一下。
题目大概的意思是,你输入一些物体,比如水果,人名,职业等,然后统计你输入的字符串中的各个条目的种类及其对应的数目。
(1)先上我的,直接统计法text = '苹果 芒果 草莓 芒果 苹果 草莓 芒果 香蕉 芒果 草莓'
fo = open('Py203.txt','w')
#
text = text.split(' ')
tpe = list(set(text)) <font color="#ff0000">#核心在于这的分类别</font>
<font color="#ff0000">tnum = [text.count(i) for i in tpe] <font color="#ff0000">#以及第二个这里的生成数目</font></font>
#
d = {}
#
d = dict(zip(tpe,tnum)) <font color="#ff0000"># 以及这里的第三部的缝合</font>
ls = list(d.items())
ls.sort(key = lambda x : x[1],reverse=True)
for k in ls:
fo.write('{}:{}'.format(k[0],k[1]))
fo.close()
这是个很正常的思路,是个很简单的思路,按照人家给的结构就是这样写:(1)统计类别,用set (2)生成数目,用列表生成器,(3) 缝合生成键值对,用dict字典
但是答案给了个很巧的方法:text = '苹果 芒果 草莓 芒果 苹果 草莓 芒果 香蕉 芒果 草莓'
fo = open('Py203.txt','w',encoding = "utf-8")
#
text = text.split(' ') # 删去了我的(2)(3)
#
d = {}
#
<font color="#ff0000">for item in text:
d[item] = d.get(item,0) + 1</font>
ls = list(d.items())
ls.sort(key = lambda x : x[1],reverse=True)
for k in ls:
fo.write('{}:{}'.format(k[0],k[1]))
fo.close()
这个方法,利用d.get()方法的独特性,当给定一个item时,自然d中是没有的,一般来书我们会认为没有就是不能找到,但是恰恰是没有到有的这个过程是建立键值对的过程。因此,当给定一个名字的时候,肯定先是找不到,但是此时会建立一个key,并且得到其数值为0;接着后面就可以到了,知此时得到的d.get('苹果')的返回值就是当前的数目,然后再加上1,就可以得到一个新的值,这个值也是现在加入之后的值。
当然还有要提的说法就是,这个ls.sort(key = lambda x : x[1],reverse=True)的方法,很好啊,是灵活使用了匿名函数,或者是说,灵活使用了排序sort的方法。只是要注意这个sort方法中的需要使用一个key的参数,其值应该是个函数的名字不加括弧!!
(3)还有一种思路,直接统计生成字典,核心代码如下>>> names=input("请输入各个同学行业名称,行业名称之间用空格间隔(回车结束输入):")
请输入各个同学行业名称,行业名称之间用空格间隔(回车结束输入):护士 旅游 老师 护士 老师 老师
>>> occu = names.split(' ')
>>> occu
['护士', '旅游', '老师', '护士', '老师', '老师']
>>> test_dict = {}
<b>>>>> for i in occu:
test_dict[i] = occu.count(i)</b>
>>> test_dict
{'护士': 2, '旅游': 1, '老师': 3}
其实这个方法和(2)的很像啊,我的想法就是对每个i进行统计,反正无非是重复,但是不管怎么重复赋值键值对,都只是重新赋值而已,比如‘老师’,‘护士’,‘老师’,这样的第二次到‘老师’的时候也不会影响这个实际数目>>> for i in occu:
d[i] = d.get(i,0)+1
这个想法是:对每个i都统计一次,如果遇到没有的key,就是创建,而遇到了已有的,就加一更新条目
|