'''
【程序功能】
寻找字符串中包含的所有数字的朋友数字,朋友数字即数值之和相同的数字字符串例如134和224,并将各朋友数字组存入同一列表中,
同一组朋友数字需按数字字符的顺序从小到大排列,多个数字朋友组则按数值之和从小到大顺序排列。
【测试数据与运行结果】
输入:
143,267,342,562,224,134,276,252
输出:
['134', '143', '224']
['252', '342']
['562']
['267', '276']
'''
def findNumFriends(s):
s = s.split(',')
print(s)
d,result = {},[]
for num in s:
sumNum = sum(map(int, num))
print("sumNim=",sumNum)
if sumNum in d:
d[sumNum] += [num]
print(sumNum,d[sumNum])
else:
d[sumNum] = [num]
print(sumNum,d[sumNum])
# 更Pythonic的写法为:
#d[sumNum] = d.get(sumNum, []) + [num]
print("d:",*d)
lst = sorted(d.items()) # key = lambda d:d[0]为默认情况,可省略
print("lst:",*lst)
result = map(sorted, [x[1] for x in lst])
return result
s = '143,267,342,562,224,134,276,252'
result = findNumFriends(s)
print(*result, sep='\n') # *result用于解包
'''
对于这个问题定义一个处理函数,其思路可以考虑如下:
处理数据:用字符串的split()方法将数字字符分隔后存如列表中,如果想转换成int类型可以用map()函数辅助处理;
1
s = s.split(',')
2. 统计:利用Python中for循环简洁有效的序列项迭代思路遍历每一个数字字符,并对每一个数字字符进行和的计算,这里用两个for循环即可;
for num in s:
sumNum = sum(map(int, num))
3. 保存统计结果:因为同一个数字和可能对应多个数字字符串,所以可以利用字典的映射特征将结果存入字典中;
d, result = {}, []
if sumNum in d:
d[sumNum] += [num]
else:
d[sumNum] = [num]
# 更Pythonic的写法为:
d[sumNum] = d.get(sumNum, []) + [num]
4.排序:注意此处有两个排序,一是基于数字和排序,二是同一数字和各数字的排序,此处应考虑多用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,调用函数即可得到最终的结果。
result = findNumFriends(s)
print(*result, sep='\n') # *result用于解包
通过如上这个例子大家是不是进一步理解了Pythonic的编程思想了呢?
在日常的使用中一定要多多去思考和使用,也可以多掌握一些标准库的使用,
例如假设要判断某一个字符是否是字母,除了借助内建的函数/方法和ASCII值得转换外还可以借助string模块来完成:
'''