鱼C论坛

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

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

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

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

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

x


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






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


例子:
average_string('one three two')
>>>two
average_string('five five five')
>>>five
average_string('ku fthj two')
>>>'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以内
def average_string(string):
  dic=dict(zip(('one','two','three','four','five','six','seven','eight','nine','ten'),range(1,11)))
  lst=string.split(' ')
  res=0
  for i in lst:
    tmp=dic.get(i,0)
    if not tmp: return 'n/a'
    res+=tmp
  return res/len(lst)
    
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 编辑
def average_string(s):
    num_en = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine']
    de_str = s.strip().split(' ')
    return num_en[int(sum([num_en.index(x) for x in de_str]) / len(de_str))] if \
           all(item in num_en for item in de_str) and \
           (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 | 显示全部楼层
# -*- coding: utf-8 -*-
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:
        value=sum([num_map[x] for x in s.split()])/len(s.split())
        new_map={v:k for k,v in num_map.items()}
        return new_map[value]
    except KeyError:
        return 'n/a'
s='one three two'
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 | 显示全部楼层
简化成一行代码:
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(' '))
print(average_string('one two three'))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2017-8-13 12:09:53 | 显示全部楼层
def average_string(mystr):
    mystr=mystr.strip();#去掉前后空格
    mystr=mystr+' '
    mydata=['zero','one','two','three','four','five','six','seven','eight','nine']
    All=0
    count=0
    mystrbeg=0
    mystrend=0
    oneword=''
    while mystrbeg<len(mystr)-1:
        mystrend=mystr.find(' ',mystrbeg)
        oneword=mystr[mystrbeg:mystrend]
        if oneword not in mydata:
            #end def
            return 'n/a'
        All+=mydata.index(oneword)
        count+=1
        mystrbeg=mystrend+1
    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 编辑
def average_string(s):
        tran_ed={'zero':0,'one':1,'two':2,'three':3,'four':4,'five':5,'six':6, 'seven':7,'eight':8,'nine':9}
        lists=s.split(' ')
        sum_=0
        i=0
        stri_=['zero','one','two','three','four','five','six','seven','eight','nine']
        for lis in lists:
                if lis not in stri_:
                        return 'n/a'
                        break
                else:
                        sum_=sum_+tran_ed[lis]
                        i=i+1
        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写的
def average_string(str1):
    m = {'zero': '0',
         'one': '1',
         'two': '2',
         'three': '3',
         'four': '4',
         'five': '5',
         'six': '6',
         'seven': '7',
         'eight': '8',
         'nine': '9',}
    M = {0:'zero',
         1:'one',
         2:'two',
         3:'three',
         4:'four',
         5:'five',
         6:'six',
         7:'seven',
         8:'eight',
         9:'nine',}
        
    sum = 0
    list = ''
    list = str1.split()
    n = len(list)
    for number in list:
        sum += int(m[number])
    average = M[sum / n]
    print average
try函数还没学。。

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-8-13 12:39:24 | 显示全部楼层
def average_string(s):
    digit = ['zero','one','two','three','four','five','six','seven','eight','nine']
    lst = [digit.index(i) for i in s.split() if i in digit]
    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 编辑
def average_string(s):
    list1 = ['zero','one','two','three','four','five','six','seven','eight','nine']
    sum = 0
    flag = 'n/a'
    if (set(list1)>=set(s.split())):
        for each in s.split():
            sum += list1.index(each)
        if(sum%len(s.split())==0): #考虑几个数的平均数不是整数的情况,如果几个数的平均数不是整数(比如:1,3,4)则同样返回n/a
            flag = list1[(sum//len(s.split()))]
    return flag
str0 = input("请输入一个字符串,以空格作为间隔(如:... ...):")
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 编辑
def average_string(string):
    '''return the average of numbers in a string,
    where numbers are in the form of english word, instead of digits'''
    dict1={'zero':0,'one':0,'two':0,'three':0,'four':0,
           'five':0,'six':0,'seven':0,'eight':0,'nine':0}
    dict2={'zero':0,'one':1,'two':2,'three':3,'four':4,
           'five':5,'six':6,'seven':7,'eight':8,'nine':9}
    flag=True
    list1=string.split()
    for each in list1:
        if each not in dict1:
            falg=False
            return 'n/a'
        else:
            dict1[each]+=1
    # print('dict1\n',dict1)
    sumvalue=(dict1['zero']*0+dict1['one']*1+dict1['two']*2
              +dict1['three']*3+dict1['four']*4+dict1['five']*5
              +dict1['six']*6+dict1['seven']*7+dict1['eight']*8
              +dict1['nine']*9)
    # Python会将 圆括号,中括号和花括号中的行隐式的连接起来
    # print('sumvalue\n',sumvalue)
    items=sum(dict1.values())
    #print('items\n',items)
    average=sumvalue/items
    #print('average\n',average)

    def num2english(s):
        s_list=list(s)
        for i in range(len(s_list)):
            for each2 in dict2:
                if dict2[each2]==int(s_list[i]):
                    s_list[i]=each2
                    break
        s_string=''
        for each in s_list:
            s_string=s_string+' '+each
        s_string=s_string.strip()
        return s_string
            
    string2=str(average)
    list2=string2.split('.')
    integral=num2english(list2[0])
    fractional=''
    length=len(list2)
    if length==2:
        fractional=' point '+num2english(list2[1])
    if fractional==' point zero':
        fractional=''
    string3=integral+fractional
    return string3
    return dict1

print(average_string('ten'),end='\n\n')
print(average_string('one two three'),end='\n\n')
print(average_string('five five five'),end='\n\n')
print(average_string('three five five'),end='\n\n')
print(average_string('one two three five'),end='\n\n')


    

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-23 02:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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