python input().split()_【Python杂记】第五篇:把输入函数input()接收的字符串转换成字典...

今天看了一道编程的练习题:

按照 用户名:彩票号码,用户名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

好了,我的方法就到这里,朋友们还有没有更好的解决方案?欢迎在评论区分享,谢谢大家。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值