自主学习进度2
最近模块2和3的学习不是太容易
Python强大的一个原因是它有非常强大的第三方库,另外还有一个原因是Python语言本身的简单、明确和优雅,特别是学过其他编程语言的小伙伴应该更有感触,Python语法和各种数据结构等太简单便捷了,所以在解决问题时要尽量考虑用Python化的思想来写程序,提高自己的编程效率。在“字典和集合编程示例介绍”视频中有3个例子大家可以好好体会,下面再以一个我上课时用的例子给大家简单分析一下。
【程序功能】
寻找字符串中包含的所有数字的朋友数字,朋友数字即数值之和相同的数字字符串例如134和224,并将各朋友数字组存入同一列表中,同一组朋友数字需按数字字符的顺序从小到大排列,多个数字朋友组则按数值之和从小到大顺序排列。
【测试数据与运行结果】
输入:
143,267,342,562,224,134,276,252
输出:
['134', '143', '224']
['252', '342']
['562']
['267', '276']
对于这个问题定义一个处理函数,其思路可以考虑如下:
-
处理数据:用字符串的split()方法将数字字符分隔后存如列表中,如果想转换成int类型可以用map()函数辅助处理;
s = s.split(',')
-
统计:利用Python中for循环简洁有效的序列项迭代思路遍历每一个数字字符,并对每一个数字字符进行和的计算,这里用一个for循环即可;
for num in s: sumNum = sum(map(int, num)
-
保存统计结果:因为同一个数字和可能对应多个数字字符串,所以可以利用字典的映射特征将结果存入字典中;
d, result = {}, [] for 循环内: ... d[sumNum] = d.get(sumNum, []) + [num]
-
排序:注意此处有两个排序,一是基于数字和排序,二是同一数字和各数字的排序,此处应考虑多用Python提供的函数。针对测试数据,字典d中的数据形如:
{8: ['143', '224', '134'], 15: ['267', '276'], 9: ['342', '252'], 13: ['562']}
基于数字和的排序可以使用sorted()函数:
lst = sorted(d.items()) # key为默认值lambda d: d[0],可以不写
排序完后lst中的结果形如:[(8, ['143', '224', '134']), (9, ['342', '252']), (13, ['562']), (15, ['267', '276'])]
要接着对每一个值(多个列表)进行排序,此处可以显式地使用循环语句,更Python化的方法是使用隐射函数map(),将sorted函数作用在lst的每一个键对应的值上,可用如下代码:
result = map(sorted, [x[1] for x in lst] )
这样实现更便捷。最后函数将结果返回即可。在主模块中输入s并传递给形参s,调用函数用*对返回的map对象进行解包用print输出即可得到最终的结果。print(*result, sep='\n')
通过如上这个例子大家是不是进一步理解了Pythonic的编程思想了呢?在日常的使用中一定要多多去思考和使用,也可以多掌握一些标准库的使用,例如假设要判断某一个字符是否是字母,除了借助内建的函数/方法和ASCII值得转换外还可以借助string模块来完成:
>>> import string
>>> dir(string) ['Formatter', 'Template', '_ChainMap', '_TemplateMetaclass', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_re', '_string', 'ascii_letters', 'ascii_lowercase', 'ascii_uppercase', 'capwords', 'digits', 'hexdigits', 'octdigits', 'printable', 'punctuation', 'whitespace']
>>> 'c' in string.ascii_letters
True