今天看了一道编程的练习题:
按照 用户名:彩票号码,用户名1:彩票号码_1.....的形式,随意输入用户名和对应的彩票号码,每一组用户名:彩票号码之间用逗号分隔。
再输入一个自定义中奖号码。
要求打印哪些用户中奖,哪些用户没中奖。本来题目很简单,遍历字典就能搞定。但该题非得强制指定input的输入格式为:
name:num,name_1:num_1:name_2:num_2,name_3:num_3
这一规定,立刻就提高了难度,在我印象中,python的input函数只能接收字符串啊,这样写,那也是一个字符串呀。
我的第一个解法如下:
'''定义一个函数,形参users是一个字典,接收主函数实参user_list的字典,表示用户名对应的彩票号码,形参target是接收自定义中奖号码'''
def luck_num(users, target):
for name, code in users.items(): #遍历字典,用name存放用户名,用code存放彩票号码
if code == target: #如果彩票号码和自定义的中奖号码相等
print(f'恭喜{name}中奖,号码是{code}') #就打印中奖用户的名字和彩票号码
else:
print(f'{name}没有中奖') #否则就打印某用户没有中奖
#定义用户名和彩票号码的字典user_list,中间用逗号隔开
user_list = {'zhangsan': '888', 'lisi': '222', 'wangwu': '666', 'xiaoming': '888'}
#使用函数luck_num去比较
luck_num(user_list, '888')
运行效果如下:
恭喜zhangsan中奖,号码是 888
lisi没有中奖
wangwu没有中奖
恭喜xiaoming中奖,号码是 888
这样写的,是可以用遍历的方法快速找出字典里的信息的,但是不符合题意,题目要求要用input函数输入用户名和号码的对应。
换言之就是非要把input接收的字符串弄成字典!!!
第二种解法如下:
import re #python标准库,正则表达式过滤
def luck_num(users, target):
for name, code in users.items():
if code == target:
print(f'恭喜{name}中奖,号码是{code}')
else:
print(f'{name}没有中奖')
#请输入字典(每一对键值之间用“,”分开):
my_enter = input('请采用name:num,name1:num1....格式输入用户和号码: ')
luck_code = input('请输入中奖号码: ')
my_dict={}#定义一个空字典
my_enter = str(str(my_enter.split(",")).split(":"))#先分离键值对,再分离键和值
my_enter = re.sub(" ",'',my_enter)
my_enter = re.sub("\[",'',my_enter)
my_enter = re.sub("\]",'',my_enter)
my_enter = re.sub("\"",'',my_enter)
my_enter = re.sub("\'",'',my_enter)#把字符中其余元素去掉
my_enter = my_enter.split(",")#最后把字符串转换成列表样式
for i in range(0,len(my_enter),2):
my_dict[str(my_enter[i])] = my_enter[i+1]
print(type(my_dict))
luck_num(my_dict, luck_code)
运行结果:
请采用name:num,name1:num1....格式输入用户和号码: zhangsan:888,lisi:222,wangwu:666,xiaoming:888
请输入中奖号码: 888
恭喜zhangsan中奖,号码是 888
lisi没有中奖
wangwu没有中奖
恭喜xiaoming中奖,号码是 888
在上面用“,”和“:”分开的时候字符串就已经被转换成列表了,再次将字符串转换成列表的时候,列表中的“[”和“]”还有元素之间的分隔符单引号也会被一同转化成字符串,所以需要在去掉。最后用for循环把键值对对应起来。
还有一种比较简单的方法::
import re #python标准库,正则表达式过滤
def luck_num(users, target):
for name, code in users.items():
if code == target:
print(f'恭喜{name}中奖,号码是{code}')
else:
print(f'{name}没有中奖')
#请输入字典(每一对键值之间用“,”分开):
my_enter = input('请采用name:num,name1:num1....格式输入用户和号码: ')
luck_code = input('请输入中奖号码: ')
my_dict={}#定义一个空字典
my_enter=str(str(my_enter.split(",")).split(":")).replace(" ","").replace("[","").replace("]","").replace("\"","").replace("\'","")#先分离键值对,再分离键和值#把字符中其余元素去掉
my_enter = my_enter.split(",")#最后把字符串转换成列表样式
for i in range(0,len(my_enter),2):
my_dict[str(my_enter[i])] = my_enter[i+1]
print(type(my_dict))
luck_num(my_dict, luck_code)
运行结果:
请采用name:num,name1:num1....格式输入用户和号码: zhangsan:888,lisi:222,wangwu:666,xiaoming:888
请输入中奖号码: 888
恭喜zhangsan中奖,号码是 888
lisi没有中奖
wangwu没有中奖
恭喜xiaoming中奖,号码是 888
好了,我的方法就到这里,朋友们还有没有更好的解决方案?欢迎在评论区分享,谢谢大家。