鱼C论坛

 找回密码
 立即注册
查看: 2804|回复: 26

[技术交流] Python:每日一题 189

[复制链接]
发表于 2018-7-22 13:04:27 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 冬雪雪冬 于 2018-7-25 23:01 编辑

我们的玩法做了一下改变:

1. 楼主不再提供答案。
2. 请大家先独立思考,再参考其他鱼油的解答,这样才有助于自己编程水平的提高。开始阶段是看不到其他人的回帖的,等答题完成,开始评分时再取消限制。
3. 鼓励大家积极答题,奖励的期限为出题后24小时内。
4. 根据答案的质量给予1~3鱼币的奖励。

题目:
给出一组数字(可以是正负整数浮点数或0),求出这些数字中与这组数字平均值最接近的数字。
例如:
0, 2, -1.4
平均值是0.2,最接近的数是0
2, 4, 6, 8
平均值的5,最接近的数是4, 6
0, 2, -1.4, 0
平均值是0.15,最接近的数是0(注相同的数字只取一个)

要求编写函数,参数为列表或元组或用*接收一组数字,返回元组,结果为1个的返回(0, )这样的,结果为2个返回(4, 6)这样的。

选做部分:
在计算时会出现误差,例如:
[-2, 0, 0.3, 2.3]的平均值是0.14999999999999997,与0更接近些,但都知道平均值应该为0.15,与0和0.3都是最接近的。如何在出现中修正这种问题。

==========================================================================================
对于此问题我是这样考虑的,平均值和最接近的两个值的差应该是非常接近的。如果(平均值为a)
((0.3-a)-(a-0))/a <1e-8基本就可认为想到了。

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2018-7-22 13:32:52 | 显示全部楼层
本帖最后由 塔利班 于 2018-7-22 14:44 编辑
  1. def fun189(x):
  2.     y=list(x)
  3.     g=lambda a:abs(a-sum(x)/len(x))
  4.     y.sort(key=g)
  5.     return tuple(set([z for z in y if g(z)==g(y[0])]))
复制代码


小数部分解决有点没头绪,感觉代码可能会写的多,看大神的吧

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2018-7-22 14:14:39 | 显示全部楼层
本帖最后由 凌九霄 于 2018-7-22 15:05 编辑
  1. def limitvalue(*args):
  2.     average = sum(args) / len(args)
  3.     lv = tuple(map(lambda x: abs(round(x - average, 2)), args))
  4.     result = sorted(tuple(zip(lv, args)), key=lambda x: x[ 0 ])
  5.     result = tuple(set([ x[ 1 ] for x in result if x[ 0 ] == result[ 0 ][ 0 ] ]))
  6.     return result


  7. print(limitvalue(0, 2, -1.4))
  8. print(limitvalue(2, 4, 6, 8))
  9. print(limitvalue(0, 2, -1.4, 0))
  10. print(limitvalue(-2, 0, 0.3, 2.3))
  11. print(limitvalue(1,1,1,1,1))
复制代码

360截图20180722150453092.jpg

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2018-7-22 16:48:18 | 显示全部楼层
186那题我又看了一下,运行久了点,但结果还是出的来的,

  1. def fun189(nums):
  2.     result = float('%.2f' % (sum(nums) / len(nums)))
  3.     l1 = [abs(each - result) for each in nums]
  4.     ind = l1.index(sorted(l1[:])[0])
  5.     if sorted(l1[:])[0] != sorted(l1[:])[1]:
  6.         return (nums[ind],)
  7.     elif nums.count(nums[ind]) > 1:
  8.         return (nums[ind],)
  9.     else:
  10.         return (nums[ind],nums[l1.index(sorted(l1[:])[0],ind+1)])
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2018-7-22 17:27:07 | 显示全部楼层
  1. def fun189(*params):
  2.     sum_num = 0
  3.     for each in params:
  4.         sum_num += each
  5.     average = sum_num/len(params)

  6.     temp_list = []  #存储每个数字和平均值的差值
  7.     for each in params:
  8.         temp_list.append(abs(each-average))
  9.     min_average = min(temp_list)

  10.     result = []
  11.     for each in list(zip(temp_list,params)):
  12.         if each[0] == min_average:
  13.             result.append(each[1])
  14.     return tuple(set(result))   #利用集合不能有相同元素的特性去掉相同的元素
复制代码

  1. >>> fun189(0,2,-1.4)
  2. (0,)
  3. >>> fun189(2,4,6,8)
  4. (4, 6)
  5. >>> fun189(0,2,-1.4,0)
  6. (0,)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2018-7-22 20:28:23 | 显示全部楼层
  1. >>> def getMode( ls ):
  2.         r = len(ls)
  3.         for x in ls:
  4.                 while not (1.0*x*r).is_integer():
  5.                         r *= 10
  6.         return r,[int(x*r) for x in ls]

  7. >>> def fun( ls ):
  8.         m, nls = getMode(ls)
  9.         avg = sum(nls) // len(nls)
  10.         mi_ls = [ abs(x-avg) for x in nls ]
  11.         mi = min(mi_ls)
  12.         fs = [x==mi for x in mi_ls]
  13.         return tuple(set( ls[i] for i in range(len(ls)) if fs[i] ))

  14. >>> fun([0,2,-1.4])
  15. (0,)
  16. >>> fun([2,4,6,8])
  17. (4, 6)
  18. >>> fun([0,2,-1.4,0])
  19. (0,)
  20. >>> fun([-2,0,0.3,2.3])
  21. (0, 0.3)
  22. >>>
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2018-7-23 12:48:41 | 显示全部楼层
  1. def fun189(*args):
  2.     middef = lambda x:sum(x)/len(x)
  3.     midnum = round(middef(args), 2)
  4.     entropy =  abs(args[0] - midnum)
  5.     tmp = []
  6.     res = []
  7.     for i in args:
  8.         if i in tmp:
  9.             continue
  10.         if abs(i - midnum) < entropy:
  11.             entropy = abs(i - midnum)
  12.             res = []
  13.             res.append(i)
  14.         elif abs(i - midnum) == entropy:
  15.             res.append(i)
  16.         tmp.append(i)
  17.     return tuple(res)
  18. print(fun189(0, 2, -1.4))
  19. print(fun189(2, 4, 6, 8))
  20. print(fun189(0, 2, -1.4, 0))
  21. print(fun189(-2, 0, 0.3, 2.3))
复制代码

只是适用于当前的组数据,并没有对这个问题完全考虑。比如如果浮点数是多位的时候,是不是需要精确计算。计算只要遇到浮点数就会是一个大坑。。。这里只做了简单处理

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2018-7-23 13:40:25 | 显示全部楼层
  1. def fun189(*value):
  2.     lv = list(value)
  3.     avg = sum(lv) / len(lv)
  4.     mv = min([abs(i - avg) for i in lv])
  5.     result = ()
  6.     for i in list(value):
  7.         if (abs(i - avg) - mv) < 1e-16:
  8.             if i not in result:
  9.                 result += (i, )
  10.     return result


  11. print(fun189(0, 2, -1.4))
  12. print(fun189(2, 4, 6, 8))
  13. print(fun189(0, 2, -1.4, 0))
  14. print(fun189(-2, 0, 0.3, 2.3))
复制代码


结果:
(0,)
(4, 6)
(0,)
(0, 0.3)

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

头像被屏蔽
发表于 2018-7-23 14:41:22 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-23 16:34:57 | 显示全部楼层
def fun189(*ar):       
        avg=sum(ar)/len(ar)
        brr=sorted([(abs(x-avg),x) for x in ar])
        res=[brr[0][1]]
        for i in range(1,len(brr)):
                if abs(brr[i][0]-brr[i-1][0])<=10**(-10):
                        res.append(brr[i][1])
                else:
                        return tuple(res)

print(fun189(-2, 0, 0.3, 2.3))

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2018-7-23 16:37:24 | 显示全部楼层
def fun189(*ar):       
        avg=sum(ar)/len(ar)
        brr=sorted([(abs(x-avg),x) for x in ar])
        res=[brr[0][1]]
        for i in range(1,len(brr)):
                if abs(brr[i][0]-brr[i-1][0])<=10**(-10):
                        res.append(brr[i][1])
                else:
                        return tuple(set(res))

print(fun189(0, 2, -1.4, 0))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-23 19:46:50 | 显示全部楼层
def average(*nums):
    temp = []
    nums = list(nums)
    # print(nums)
    ave = (sum(nums))/len(nums)
    # print('平均数:',ave)
    if ave in nums:
        temp.append(ave)
    else:
        nums.append(ave)
        nums.sort()
        ave_index = nums.index(ave)
        dif_last = abs(nums[ave_index-1]-ave)
        dif_next = nums[ave_index+1]-ave
        if dif_last==dif_next:
            temp.append(nums[ave_index-1])
            temp.append(nums[ave_index+1])
        elif dif_last < dif_next:
            temp.append(nums[ave_index-1])
        else:
            temp.append(nums[ave_index+1])
    temp = tuple(temp)
    print(temp)
   
   
average(2,4)

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2018-7-23 20:22:26 | 显示全部楼层
  1. import math
  2. def Mean(numbers):
  3.         sum = 0
  4.         for number in numbers:
  5.                 sum += float(number)
  6.         avg = sum/len(numbers)
  7.         if avg == int(avg):
  8.                 mean = (int(avg)-1, int(avg)+1)
  9.         elif avg-int(avg) < math.ceil(avg)-avg:
  10.                 mean = (int(avg), )
  11.         else:
  12.                 mean = (math.ceil(avg), )
  13.         return(mean)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2018-7-23 20:45:58 | 显示全部楼层
  1. def f(list0 = []):
  2.     Sum = 0
  3.     for each in list0:
  4.         Sum += each
  5.     averge = Sum/(len(list0))
  6.     list1 = []
  7.     for each in list0:
  8.             list1.append((abs(each-averge),each))
  9.     list1.sort()
  10.     for i in range(1,len(list0)):
  11.             if list1[i][0] == list1[0][0]:
  12.                     if list1[i][1] != list1[0][1]:
  13.                             return ((list1[0][1],list1[i][1]))
  14.                     else:
  15.                             return ((list1[0][1],))
  16.     return ((list1[0][1],))
复制代码


#测试结果
f([2,4,6,8])
(4, 6)
f([0,2,-1.4,0])
(0,)

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2018-7-23 21:11:32 | 显示全部楼层
本帖最后由 天圆突破 于 2018-7-23 21:57 编辑
  1. from functools import reduce
  2. import re

  3. def chanfloat(f):
  4.     xs = re.search('\.\d+',str(f))
  5.     return 0 if xs == None else len(xs.group())-1

  6. def func189(lst):
  7.     lstN = list(map(lambda x:int(x*(10**max(map(lambda x:chanfloat(x), lst)))), lst))
  8.     avg = list(map(lambda x:abs(x-reduce(lambda x,y:x+y,lstN)/len(lstN)), lstN))
  9.     return list(map(lambda x:lst[x], [i for i in range(len(avg)) if avg[i]==min(avg)]))

  10. if __name__ == '__main__':
  11.     lst = [-2, 0, 0.3, 2.3]
  12.     res = func189(lst)
  13.     print(res)
复制代码


带附加题一起了

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2018-7-23 23:31:36 | 显示全部楼层
判断浮点数是否相等,可以用判断两者是否足够接近的方法
  1. import math

  2. def fun(lst):
  3.     if len(lst) >1:
  4.         lst = sorted([(abs(len(lst)*i - sum(lst)), i) for i in lst],
  5.                      key=lambda x:x[0]) # 这个key指明才能保证元组顺序
  6.         return (lst[0][1], lst[1][1]) if math.isclose(lst[0][0], lst[1][0]) \
  7.                and lst[0][1] != lst[1][1] else (lst[0][1],)
复制代码


不要排序那个推导式和三元操作符,消耗小得多
  1. import math

  2. def fun2(lst):
  3.     length = len(lst)
  4.     average = sum(lst) / length
  5.     result, minimum = (lst[0],), max(lst)

  6.     for i in lst:
  7.         temp = abs(i - average)
  8.         if math.isclose(temp, minimum) and i not in result:
  9.             result = result[0], i
  10.         elif temp < minimum:
  11.             minimum = temp
  12.             result = i,
  13.         
  14.     return result
复制代码


换成又能列表元组又能直接一串数字,
试下不用浮点型,确定精度后直接在整型里处理
  1. def fun3(*args, ndigits=9):
  2.     """args参数为列表或元组或直接一组数字,数据保留小数点后ndigits位,返回元组"""
  3.    
  4.     if not isinstance(args[0], int):
  5.         args = args[0]
  6.         
  7.     if len(args) > 1:
  8.         args_cp = [round(i * 10**ndigits) for i in args]
  9.         dic = {j: abs(len(args_cp) * i - sum(args_cp)) for i, j in zip(args_cp, args)}
  10.         
  11.         lst = sorted(dic, key=lambda x: (dic[x], args.index(x)))
  12.         return (lst[0],) if dic[lst[0]] != dic[lst[1]] else (lst[0], lst[1])
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2018-7-24 14:56:52 | 显示全部楼层
  1. def zuijiejinshu(*num):
  2.     count = 0
  3.     sum1 = 0
  4.     list1 = []
  5.     num = list(num)
  6.     for i in num:
  7.         sum1 = i + sum1
  8.         count = count + 1
  9.     pingjunshu = sum1 / count
  10.     print(pingjunshu)
  11.     for j in num:
  12.         if j - pingjunshu == 0:
  13.             print(j)
复制代码


到这一步能求出平均数与某个值一样的的情况,另一种不一致的情况从昨天到现在有思路(求出与平均值最小差额的值),但编写不出代码实现。。求老师指点!!!

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
冬雪雪冬 + 1 + 1 参考一下其他鱼油的答案

查看全部评分

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

使用道具 举报

发表于 2018-7-25 15:33:37 | 显示全部楼层
  1. def Approach(list1):
  2.         F1 = 1
  3.         r2 = None
  4.         x = sum(list1)/len(list1)
  5.         print(x)
  6.         for i in list1:
  7.                 if F1 == 1:
  8.                         z = abs(x - i)
  9.                         F1 =0
  10.                 else:
  11.                         y = abs(x - i)
  12.                         try:
  13.                                 if y < z:
  14.                                         z = y
  15.                                         r1 = i
  16.                                 elif y == z:
  17.                                         r2 = i
  18.                         except:
  19.                                 pass
  20.         if r2:
  21.                 print(r1,r2)
  22.         else:
  23.                 print(r1)

  24. list1 = [-2,0,0.3,2.3]
  25. Approach(list1)
  26. list2 = [2,4,6,8]
  27. Approach(list2)
复制代码

点评

list1 = [0, 2, -1.4]时出错  发表于 2018-7-25 23:17
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-25 20:45:16 | 显示全部楼层
诶,又长又臭,求大佬简化修改
  1. import math
  2. def tuple1(*args):
  3.     sum1 = 0
  4.     num1 = 0
  5.     list1 = []
  6.     list2 = []
  7.     # 求出平均值
  8.     for i in args:
  9.         sum1 += i
  10.     average = sum1/len(args)
  11.     # 求出与平均值最接近的数
  12.     for j in args:
  13.         list1.append(math.fabs(average-j))
  14.     min1 = min(list1)
  15.     # 判断与平均值最接近的数的个数
  16.     for m in range(len(list1)):
  17.         if min1 == list1[m]:
  18.             num1 += 1
  19.             list2.append(m)
  20.     # 根据与平均值最接近的数的个数的不同的输出方式
  21.     if num1 == 1:
  22.         print("平均值是%s,最接近的数是%s"%(average,args[list2[0]]))
  23.     else:
  24.         print("平均值是%s,最接近的数是%s,%s"%(average,args[list2[0]],args[list2[1]]))

  25. tuple1(2,4,6,8)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2018-7-26 09:28:20 | 显示全部楼层

#找到错误了,谢谢指正!
  1. def Approach(list1):
  2.         F1 = 1
  3.         r2 = None
  4.         x = sum(list1)/len(list1)
  5.         print(x)
  6.         for i in list1:
  7.                 if F1 == 1:
  8.                         z = abs(x - i)
  9.                         r1 = i
  10.                         F1 =0
  11.                 else:
  12.                         y = abs(x - i)
  13.                         #print(z,y)
  14.                         try:
  15.                                 if y < z:
  16.                                         z = y
  17.                                         r1 = i
  18.                                 elif y == z:
  19.                                         r2 = i
  20.                         except:
  21.                                 pass
  22.         if r2:
  23.                 print(r1,r2)
  24.         else:
  25.                 print(r1)

  26. '''list1 = [-2,0,0.3,2.3]
  27. Approach(list1)
  28. list2 = [2,4,6,8]
  29. Approach(list2)'''
  30. list3 = [0,2,-1.4]
  31. Approach(list3)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 22:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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