鱼C论坛

 找回密码
 立即注册
查看: 8427|回复: 92

[技术交流] Python:每日一题 78(答题领鱼币)

[复制链接]
发表于 2017-8-13 08:47:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x


哈哈哈,我觉得这道题特别有意思~






求平均数任务:请你编写一个函数average_string(),这个函数可以接受一个字符串,这个字符串中都是英文数字,我们要通过一系列高端操作来得到英文字符串的平均数。注意:数字的范围是0到9,如果字符串中有超过这个范围的数字或者其他字符串,就返回'n / a'


例子:

  1. average_string('one three two')
  2. >>>two
  3. average_string('five five five')
  4. >>>five
  5. average_string('ku fthj two')
  6. >>>'n / a'
复制代码




楼主解法:
游客,如果您要查看本帖隐藏内容请回复

大神解法:
游客,如果您要查看本帖隐藏内容请回复

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-8-13 08:51:12 | 显示全部楼层
看看大神
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-13 09:16:49 | 显示全部楼层
本帖最后由 shinemic 于 2017-8-13 13:26 编辑

def average_string(s):
    num_map = {'zero': 0, 'one': 1, 'two': 2, 'three': 3, 'four': 4,
               'five': 5, 'six': 6, 'seven': 7, 'eight': 8, 'nine': 9}
    try:
        out =  sum([num_map[x] for x in s.strip().split(' ')]) / len(s.strip().split(' '))
        return [x[0] for x in num_map.items() if out == x[1]]
    except KeyError:
        return 'n / a'
感谢@chunchun2017 的提醒,把上面不符题意的代码改成6楼所示

评分

参与人数 1荣誉 +4 鱼币 +4 收起 理由
新手·ing + 4 + 4 大神

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-13 09:20:20 | 显示全部楼层
明明可以用列表却非要用字典
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-13 09:35:13 From FishC Mobile | 显示全部楼层
最简单的写法,英文1-10以内
  1. def average_string(string):
  2.   dic=dict(zip(('one','two','three','four','five','six','seven','eight','nine','ten'),range(1,11)))
  3.   lst=string.split(' ')
  4.   res=0
  5.   for i in lst:
  6.     tmp=dic.get(i,0)
  7.     if not tmp: return 'n/a'
  8.     res+=tmp
  9.   return res/len(lst)
  10.    
  11. print(average_string('one two three'))
复制代码

评分

参与人数 1荣誉 +4 鱼币 +4 收起 理由
新手·ing + 4 + 4 难得大佬光临~我还是喜欢列表推导式

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 3 反对 0

使用道具 举报

发表于 2017-8-13 09:40:52 | 显示全部楼层
本帖最后由 shinemic 于 2017-8-13 13:24 编辑
  1. def average_string(s):
  2.     num_en = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']
  3.     de_str = s.strip().split(' ')
  4.     return num_en[int(sum([num_en.index(x) for x in de_str]) / len(de_str))] if \
  5.            all(item in num_en for item in de_str) and \
  6.            (sum([num_en.index(x) for x in de_str]) % len(de_str) == 0) else 'n / a'
复制代码

评分

参与人数 1荣誉 +4 鱼币 +4 收起 理由
新手·ing + 4 + 4 求大佬带飞~

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-13 09:43:57 | 显示全部楼层
大佬太看的起我了继续跟着甲鱼哥走起~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-13 09:45:30 | 显示全部楼层
shinemic 发表于 2017-8-13 09:43
大佬太看的起我了继续跟着甲鱼哥走起~

大神,列表推导式怎么如此熟练
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-13 09:45:33 From FishC Mobile | 显示全部楼层
jerryxjr1220 发表于 2017-8-13 09:35
最简单的写法,英文1-10以内

真要简化成一行输出都可以,只不过对于新手来说,还是先从理解程序逻辑开始比较好,基础打扎实再看简化方法。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-8-13 09:48:01 | 显示全部楼层
  1. # -*- coding: utf-8 -*-
  2. def average_string(s):
  3.     num_map = {'zero': 0, 'one': 1, 'two': 2, 'three': 3, 'four': 4,
  4.                'five': 5, 'six': 6, 'seven': 7, 'eight': 8, 'nine': 9}
  5.     try:
  6.         value=sum([num_map[x] for x in s.split()])/len(s.split())
  7.         new_map={v:k for k,v in num_map.items()}
  8.         return new_map[value]
  9.     except KeyError:
  10.         return 'n/a'
  11. s='one three two'
  12. print(average_string(s))
复制代码

评分

参与人数 1荣誉 +4 鱼币 +4 收起 理由
新手·ing + 4 + 4

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-13 09:48:58 | 显示全部楼层
新手·ing 发表于 2017-8-13 09:45
大神,列表推导式怎么如此熟练

其实是先写for循环。。然后逐步压缩成列表推导式的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-8-13 10:12:09 From FishC Mobile | 显示全部楼层
简化成一行代码:
  1. average_string=lambda string:'n/a' if sum([dict(zip(('one','two','three','four','five','six','seven','eight','nine','ten'),range(1,11))).get(i,99999999) for i in string.split(' ')])>=99999999 else sum([dict(zip(('one','two','three','four','five','six','seven','eight','nine','ten'),range(1,11))).get(i,99999999) for i in string.split(' ')])/len(string.split(' '))
  2. print(average_string('one two three'))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-13 10:52:21 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-13 12:09:53 | 显示全部楼层
  1. def average_string(mystr):
  2.     mystr=mystr.strip();#去掉前后空格
  3.     mystr=mystr+' '
  4.     mydata=['zero','one','two','three','four','five','six','seven','eight','nine']
  5.     All=0
  6.     count=0
  7.     mystrbeg=0
  8.     mystrend=0
  9.     oneword=''
  10.     while mystrbeg<len(mystr)-1:
  11.         mystrend=mystr.find(' ',mystrbeg)
  12.         oneword=mystr[mystrbeg:mystrend]
  13.         if oneword not in mydata:
  14.             #end def
  15.             return 'n/a'
  16.         All+=mydata.index(oneword)
  17.         count+=1
  18.         mystrbeg=mystrend+1
  19.     return mydata[int(All/count)]
复制代码

评分

参与人数 1荣誉 +4 鱼币 +4 收起 理由
新手·ing + 4 + 4

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-13 12:20:03 | 显示全部楼层
本帖最后由 sdsd 于 2017-8-13 12:24 编辑
  1. def average_string(s):
  2.         tran_ed={'zero':0,'one':1,'two':2,'three':3,'four':4,'five':5,'six':6, 'seven':7,'eight':8,'nine':9}
  3.         lists=s.split(' ')
  4.         sum_=0
  5.         i=0
  6.         stri_=['zero','one','two','three','four','five','six','seven','eight','nine']
  7.         for lis in lists:
  8.                 if lis not in stri_:
  9.                         return 'n/a'
  10.                         break
  11.                 else:
  12.                         sum_=sum_+tran_ed[lis]
  13.                         i=i+1
  14.         return stri_[int(sum_/i)]

复制代码

评分

参与人数 1荣誉 +4 鱼币 +4 收起 理由
新手·ing + 4 + 4

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-13 12:34:18 | 显示全部楼层
本帖最后由 hhhhhq 于 2017-8-13 12:41 编辑

python2写的
  1. def average_string(str1):
  2.     m = {'zero': '0',
  3.          'one': '1',
  4.          'two': '2',
  5.          'three': '3',
  6.          'four': '4',
  7.          'five': '5',
  8.          'six': '6',
  9.          'seven': '7',
  10.          'eight': '8',
  11.          'nine': '9',}
  12.     M = {0:'zero',
  13.          1:'one',
  14.          2:'two',
  15.          3:'three',
  16.          4:'four',
  17.          5:'five',
  18.          6:'six',
  19.          7:'seven',
  20.          8:'eight',
  21.          9:'nine',}
  22.         
  23.     sum = 0
  24.     list = ''
  25.     list = str1.split()
  26.     n = len(list)
  27.     for number in list:
  28.         sum += int(m[number])
  29.     average = M[sum / n]
  30.     print average
复制代码

try函数还没学。。

评分

参与人数 1荣誉 +4 鱼币 +4 收起 理由
新手·ing + 4 + 4

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-13 12:39:24 | 显示全部楼层
  1. def average_string(s):
  2.     digit = ['zero','one','two','three','four','five','six','seven','eight','nine']
  3.     lst = [digit.index(i) for i in s.split() if i in digit]
  4.     return digit[sum(lst) // len(lst)] if len(lst) == len(s.split()) else 'N/A'
复制代码

评分

参与人数 1荣誉 +4 鱼币 +4 收起 理由
新手·ing + 4 + 4

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-13 12:42:46 | 显示全部楼层

这段代码返回的是数字,而题目要求返回数字对应的英文
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-13 12:45:56 | 显示全部楼层
本帖最后由 chunchun2017 于 2017-8-13 12:47 编辑
  1. def average_string(s):
  2.     list1 = ['zero','one','two','three','four','five','six','seven','eight','nine']
  3.     sum = 0
  4.     flag = 'n/a'
  5.     if (set(list1)>=set(s.split())):
  6.         for each in s.split():
  7.             sum += list1.index(each)
  8.         if(sum%len(s.split())==0): #考虑几个数的平均数不是整数的情况,如果几个数的平均数不是整数(比如:1,3,4)则同样返回n/a
  9.             flag = list1[(sum//len(s.split()))]
  10.     return flag
  11. str0 = input("请输入一个字符串,以空格作为间隔(如:... ...):")
  12. print(average_string(str0))
复制代码

运行结果:
请输入一个字符串,以空格作为间隔:(如:... ...)one two three
two

>>>
============== RESTART: C:\Users\78.py ==============
请输入一个字符串,以空格作为间隔:(如:... ...)one aaa two
n/a
>>>
============== RESTART: C:\Users\78.py ==============
请输入一个字符串,以空格作为间隔:(如:... ...)one four two
n/a

评分

参与人数 2荣誉 +5 鱼币 +5 收起 理由
新手·ing + 4 + 4
shinemic + 1 + 1 感谢提醒!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-13 13:36:56 | 显示全部楼层
本帖最后由 Ss_wW 于 2017-8-13 13:47 编辑
  1. def average_string(string):
  2.     '''return the average of numbers in a string,
  3.     where numbers are in the form of english word, instead of digits'''
  4.     dict1={'zero':0,'one':0,'two':0,'three':0,'four':0,
  5.            'five':0,'six':0,'seven':0,'eight':0,'nine':0}
  6.     dict2={'zero':0,'one':1,'two':2,'three':3,'four':4,
  7.            'five':5,'six':6,'seven':7,'eight':8,'nine':9}
  8.     flag=True
  9.     list1=string.split()
  10.     for each in list1:
  11.         if each not in dict1:
  12.             falg=False
  13.             return 'n/a'
  14.         else:
  15.             dict1[each]+=1
  16.     # print('dict1\n',dict1)
  17.     sumvalue=(dict1['zero']*0+dict1['one']*1+dict1['two']*2
  18.               +dict1['three']*3+dict1['four']*4+dict1['five']*5
  19.               +dict1['six']*6+dict1['seven']*7+dict1['eight']*8
  20.               +dict1['nine']*9)
  21.     # Python会将 圆括号,中括号和花括号中的行隐式的连接起来
  22.     # print('sumvalue\n',sumvalue)
  23.     items=sum(dict1.values())
  24.     #print('items\n',items)
  25.     average=sumvalue/items
  26.     #print('average\n',average)

  27.     def num2english(s):
  28.         s_list=list(s)
  29.         for i in range(len(s_list)):
  30.             for each2 in dict2:
  31.                 if dict2[each2]==int(s_list[i]):
  32.                     s_list[i]=each2
  33.                     break
  34.         s_string=''
  35.         for each in s_list:
  36.             s_string=s_string+' '+each
  37.         s_string=s_string.strip()
  38.         return s_string
  39.             
  40.     string2=str(average)
  41.     list2=string2.split('.')
  42.     integral=num2english(list2[0])
  43.     fractional=''
  44.     length=len(list2)
  45.     if length==2:
  46.         fractional=' point '+num2english(list2[1])
  47.     if fractional==' point zero':
  48.         fractional=''
  49.     string3=integral+fractional
  50.     return string3
  51.     return dict1

  52. print(average_string('ten'),end='\n\n')
  53. print(average_string('one two three'),end='\n\n')
  54. print(average_string('five five five'),end='\n\n')
  55. print(average_string('three five five'),end='\n\n')
  56. print(average_string('one two three five'),end='\n\n')


  57.    
复制代码

评分

参与人数 1荣誉 +4 鱼币 +4 收起 理由
新手·ing + 4 + 4

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 07:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表