鱼C论坛

 找回密码
 立即注册
查看: 6282|回复: 29

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

[复制链接]
发表于 2017-11-5 17:03:37 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 冬雪雪冬 于 2017-11-10 15:19 编辑

先我们的玩法做了一下改变:
1. 楼主不再提供答案。
2. 请大家先独立思考”,再参考其他鱼油的解答,这样才有助于自己编程水平的提高。
3. 鼓励大家积极答题,奖励的期限为出题后24小时内。
4. 根据答案的质量给予1~3鱼币的奖励。

题目:
这是一个排序的练习。
有如下的一个列表:
list1 = [684, 6299800, 6041028, 2458660284, 937, 7857867, 384147026736, 888843160862, 270]
要求先求出各位之和,如果结果不是一位数,继续此步骤,直到成为1~9的数字,例如684各位之和为18,再次运算为9,然后对其排序,排序不是从1到9,也不是从9到1,是按照下面列表的次序。
list2 = [1, 6, 7, 4, 9, 3, 2, 5, 8]
最后给出list1排序后的列表。

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2017-11-5 18:05:00 | 显示全部楼层
本帖最后由 SixPy 于 2017-11-5 18:18 编辑
  1. list1 = [684, 6299800, 6041028, 2458660284, 937, 7857867, 384147026736, 888843160862, 270]
  2. list2 = [1, 6, 7, 4, 9, 3, 2, 5, 8]
  3. order = {n:i for i,n in enumerate(list2)}

  4. def x(n):
  5.     while n>9:
  6.         n = sum(int(i)for i in str(n))
  7.     return order[n]

  8. list1.sort(key=x)
  9. print(list1)
  10. #[937, 384147026736, 6299800, 684, 2458660284, 270, 6041028, 7857867, 888843160862]
复制代码

评分

参与人数 2荣誉 +1 鱼币 +4 贡献 +1 收起 理由
moc + 1 + 1 + 1
冬雪雪冬 + 3

查看全部评分

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

使用道具 举报

发表于 2017-11-6 00:11:16 | 显示全部楼层
  1. #数字n先求出各位之和,如果结果不是一位数,继续此步骤,直到成为1~9的数字
  2. def sumbit(n):
  3.     while n > 9:
  4.         total = 0
  5.         for each in list(str(n)):
  6.             total += eval(each)
  7.         n = total
  8.     return n

  9. #序列list1按照序列list2的顺序排列
  10. def sortlist(list1,list2):
  11.     list3 = [[sumbit(x),x] for x in list1]
  12.     list4 = []
  13.     for i in list2:
  14.         for j in range(len(list3)):
  15.             if i == list3[j][0]:
  16.                 list4.append(list3[j][1])
  17.     return list4

  18. list1 = [684, 6299800, 6041028, 2458660284, 937, 7857867, 384147026736, 888843160862, 270]
  19. list2 = [1, 6, 7, 4, 9, 3, 2, 5, 8]
  20. print(sortlist(list1,list2))
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-11-6 09:49:21 | 显示全部楼层
  1. list1 = [684, 6299800, 6041028, 2458660284, 937, 7857867, 384147026736, 888843160862, 270]
  2. list2 = [1, 6, 7, 4, 9, 3, 2, 5, 8]

  3. tar = []

  4. for each in list1:
  5.     while each > 9:
  6.         each = sum(map(int, str(each)))
  7.     tar.append(each)

  8. tar = sorted(tar, key = lambda x: list2.index(x))
  9. print(tar)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-6 11:03:03 | 显示全部楼层
本帖最后由 wyp02033 于 2017-11-6 11:16 编辑
  1. def get_index(num):
  2.     if num < 10:
  3.         return num

  4.     else:
  5.         new_num = 0
  6.         for each in str(num):
  7.             new_num += int(each)
  8.         return get_index(new_num)

  9. list1 = [684, 6299800, 6041028, 2458660284, 937, 7857867, 384147026736, 888843160862, 270]
  10. index_list = []
  11. for each in list1:
  12.     index_list.append(get_index(each))

  13. the_order = {1:0, 6:1, 7:2, 4:3, 9:4, 3:5, 2:6, 5:7, 8:8}
  14. num_order = []
  15. for each in index_list:
  16.     num_order.append(the_order[each])

  17. sorted_order = sorted(num_order)

  18. new_list = []
  19. for each in sorted_order:
  20.     new_list.append(list1[num_order.index(each)])
  21.     list1.remove(list1[num_order.index(each)])
  22.     num_order.remove(each)

  23. print(new_list)
复制代码


排序结果:[937, 384147026736, 6299800, 684, 2458660284, 270, 6041028, 7857867, 888843160862]

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-11-6 14:15:02 | 显示全部楼层
  1. def len_sum(n:int):
  2.     if n < 10:
  3.         return n
  4.     else:
  5.         n = str(n)
  6.         s_sum = sum(int(i) for i in n)
  7.         if len(str(s_sum)) > 1:
  8.             s_sum = len_sum(s_sum)
  9.         return s_sum

  10. list1 = [684, 6299800, 6041028, 2458660284, 937, 7857867, 384147026736, 888843160862, 270]
  11. list2 = [1, 6, 7, 4, 9, 3, 2, 5, 8]
  12. list3 = [(len_sum(i), i) for i in list1]

  13. from collections import defaultdict
  14. d = defaultdict(list)
  15. for k, v in list3:
  16.     d[k].append(v)

  17. list4 = [d[i] for i in list2 if i in d.keys()]
  18. from itertools import chain
  19. print(list(chain(*list4)))
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-11-6 14:57:10 | 显示全部楼层
看看答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-6 16:03:43 | 显示全部楼层
真的想不出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-6 16:27:17 | 显示全部楼层
比较菜,代码很陋,就做个简单的
---------------------------
def toList(numbers):
    List = [str(num) for num in numbers]
    return List

if __name__ == "__main__":
    L = toList([12345, 349, 8989009]);
    a=[]
    t=[[int(i) for i in I]for I in L]
    print(t)
    print(type(len(t)))
    for i in t:
      print(sum(i))
      if sum(i)>10:
       a.append(sum(i))
    print(a)
    K=toList(a)
    if __name__ == "__main__":
     print(K)
     ba = []
     bt = [[int(i) for i in I] for I in K]
     print(bt)
     for i in bt:
         print(sum(i))
         ba.append(sum(i))
     print(ba)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-6 17:18:39 | 显示全部楼层

  1. list1 = [684, 6299800, 6041028, 2458660284, 937, 7857867, 384147026736, 888843160862, 270]
  2. list2 = []

  3. def doit(i):
  4.     add = 0
  5.     sum1 = list(str(i))
  6.     for j in sum1:
  7.         add = add + int(j)
  8.     return add

  9. def sort(in_list):
  10.     for j in range(len(in_list)) :
  11.         if in_list[j] == 1:
  12.             in_list[j] = 1
  13.         elif in_list[j] == 6:
  14.             in_list[j] = 2
  15.         elif in_list[j] == 7:
  16.             in_list[j] = 3
  17.         elif in_list[j] == 4:
  18.             in_list[j] = 4
  19.         elif in_list[j] == 9:
  20.             in_list[j] = 5
  21.         elif in_list[j] == 3:
  22.             in_list[j] = 6
  23.         elif in_list[j] == 2:
  24.             in_list[j] = 7
  25.         elif in_list[j] == 5:
  26.             in_list[j] = 8
  27.         elif in_list[j] == 8:
  28.             in_list[j] = 9
  29.     return in_list
  30.         
  31.    

  32. for i in list1:
  33.     add = doit(i)
  34.     while add > 9 :
  35.         add = doit(add)
  36.     list2.append(add)

  37. list2 = sort(list2)

  38. #list2.sort()
  39.    
  40. print(list2)


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

使用道具 举报

发表于 2017-11-6 17:55:41 | 显示全部楼层
本帖最后由 p5494846 于 2017-11-6 17:58 编辑
  1. list1 = [684, 6299800, 6041028, 2458660284, 937, 7857867, 384147026736, 888843160862, 270]
  2. def fun_sum(x):     #定义求位和的函数  
  3.         while x > 9:
  4.                 x = str(x)
  5.                 y = 0
  6.                 for n in x:               
  7.                         y += int(n)
  8.                 x = y
  9.         return x
  10. list = map(fun_sum,list1)     #得到初始的列表

  11. list_tmp = []
  12. dict = {'1':'1','6':'2','7':'3','4':'4','9':'5','3':'6','2':'7','5':'8','8':'9'}
  13. for num in list:
  14.         tmp = dict[str(num)]
  15.         list_tmp.append(tmp)
  16. list_tmp.sort()  #根据映射关系得到值的列表

  17. #以下步骤是利用索引根据dict的值查找键
  18. list_fin = []
  19. key_list = []
  20. value_list = []
  21. for key,value in dict.items():
  22.         key_list.append(key)
  23.         value_list.append(value)       
  24. for x in list_tmp:
  25.         index = value_list.index(x)
  26.         y = key_list[index]
  27.         list_fin.append(y)  #根据映射关系反过来得到最终列表
  28. print(list_fin)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-6 18:25:42 | 显示全部楼层
递归,各位数相加直到只剩一位数,按要求排序
  1. list1 = [684, 6299800, 6041028, 2458660284, 937, 7857867, 384147026736, 888843160862, 270]
  2. list2 = [1, 6, 7, 4, 9, 3, 2, 5, 8]

  3. new_sum = lambda n: n if n<10 else new_sum(sum(int(i) for i in str(n)))
  4. new_list1 = [new_sum(num) for num in list1]
  5. print(sorted(new_list1, key=lambda x: list2.index(x)))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-6 20:37:23 | 显示全部楼层
  1. def foo(num):
  2.     while num >=10:
  3.         num = sum(map(int,list(str(num))))
  4.     return num

  5. list1 = [684, 6299800, 6041028, 2458660284, 937, 7857867, 384147026736, 888843160862, 270]
  6. dict1 = {v:k for k,v in zip(list(map(int,(list('123456789')))),[1, 6, 7, 4, 9, 3, 2, 5, 8])}
  7. d = {v:k for k,v in dict1.items()}
  8. x = [d[s] for s in sorted([dict1[r] for r in map(foo,list1)])]
  9. y = list(map(foo,list1))
  10. temp = list(zip(y,list1))
  11. result = []
  12. for i in x:
  13.     for each in range(len(temp)):
  14.         if i == temp[each][0]:
  15.             result.append(temp.pop(each)[1])
  16.             break

  17. result
  18. [937, 384147026736, 6299800, 684, 2458660284, 270, 6041028, 7857867, 888843160862]

复制代码


感觉写的有点麻烦

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-11-6 21:34:16 | 显示全部楼层
list1 = [684, 6299800, 6041028, 2458660284, 937, 7857867, 384147026736, 888843160862, 270]
list2 = [1, 6, 7, 4, 9, 3, 2, 5, 8]
print(list1)
print(list2)
'''各位加到9'''
def addnum9(x):
    while x>9:
        u=0   
        for i in str(x):
            u+=int(i)
        x=u
    return x
'''list1的数字的排序'''
listcc=[]
for i in list1:
    listcc.append(addnum9(i))
'''组合在一起'''
list4=list(zip(listcc,list1))

list5=[]
for i in list2:
    for i2 in list4:
        if i2[0]==i:
            list5.append(i2[1])
print(list5)

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-11-6 23:38:21 | 显示全部楼层
  1. list1 = [684, 6299800, 6041028, 2458660284, 937, 7857867, 384147026736, 888843160862, 270]
  2. list2=[]
  3. list3=[]
  4. list4=[1, 6, 7, 4, 9, 3, 2, 5, 8]
  5. he=0
  6. def fun(list1):

  7.     for i in list1:
  8.         he=sum(map(int,str(i)))
  9.         if he <=9:
  10.             list2.append(he)
  11.             
  12.         else:
  13.             list1=[]
  14.             list1.append(he)
  15.             fun(list1)
  16.             
  17.     return (sorted(list2,key=list4.index))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-7 08:35:28 | 显示全部楼层
数位相加用递归倒是没有什么问题。

按照规定的序列排序倒是有点烧脑子,代码看着有点繁琐。不过结果在这里:
排序前:
[9, 7, 3, 9, 1, 3, 6, 8, 9]
排序后:
[1, 6, 7, 9, 9, 9, 3, 3, 8]

  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Mon Nov  6 15:59:02 2017

  4. """
  5. import numpy as np


  6. def numSum(Num):
  7.     NumOfDigitals = int(np.log10(Num))
  8.     numAdd=0;
  9.     for i in range(NumOfDigitals, 0, -1):
  10.         if ( i == NumOfDigitals):
  11.             Digital = int(Num / pow(10, i))
  12.             numAdd=Digital
  13.             remain = Num - Digital*pow(10,i)
  14.         else:
  15.             Digital = int(remain / pow(10, i))
  16.             numAdd += Digital
  17.             remain = remain - Digital*pow(10,i)
  18.    
  19.     return numAdd + remain

  20. def digitalSum(Num):
  21.     dig_sum = Num
  22.     while(dig_sum > 9):
  23.         dig_sum = numSum(dig_sum)
  24.     return dig_sum
  25.         
  26. list1 = [684, 6299800, 6041028, 2458660284, 937, 7857867, 384147026736, 888843160862, 270]

  27. list2 = [1, 6, 7, 4, 9, 3, 2, 5, 8]
  28. nlist1=[]
  29. for i in list1:
  30.     nlist1.append(digitalSum(i))
  31.    
  32. print(nlist1)


  33. nlist1=[]

  34. for i in list1:
  35.     dig_sum = digitalSum(i)
  36.     if(len(nlist1)==0):
  37.         nlist1.append(dig_sum)
  38.     else:
  39.         index_j = 0
  40.         flag=0
  41.         order_old = list2.index(nlist1[index_j])
  42.         order_new = list2.index(dig_sum)
  43.         while (order_new > order_old and flag==0): #and index_j<len(nlist1)-1):
  44.             index_j = index_j + 1
  45.             if (index_j < len(nlist1)):
  46.                 order_old = list2.index(nlist1[index_j])
  47.             else:
  48.                 flag=1

  49.         if (flag==1):
  50.                 nlist1.append(dig_sum)
  51.         else:
  52.             nlist1.insert(index_j,dig_sum)
  53.             
  54. print(nlist1)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-7 10:56:30 | 显示全部楼层
本帖最后由 colinshi 于 2017-11-7 10:58 编辑
  1. from functools import reduce
  2. list1 = [684, 6299800, 6041028, 2458660284, 937, 7857867, 384147026736, 888843160862, 270]

  3. def add2(x, y):
  4.     return int(x) + int(y)
  5. def CaiFen(element):
  6.     a = element
  7.     while a > 9:
  8.         a = int(reduce(add2,list(str(a))))
  9.     return a
  10. g=[]
  11. for i in list1:
  12.     g.append(CaiFen(i))
  13. z=zip(g,list1)
  14. dic={}
  15. for k,v in z:
  16.     dic[v]=k
  17. l=[]
  18. list2 = [1, 6, 7, 4, 9, 3, 2, 5, 8]
  19. for i in list2:
  20.     for v,k in dic.items():
  21.         if i == k:
  22.             l.append(v)
  23. print(l)
复制代码

代码感觉写的有点长,没有精简。

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-11-7 11:39:10 | 显示全部楼层
  1. list1= [684,6299800,6041028,2458660284, 937,7857867,384147026736,888843160862,270]
  2. list2 = [1, 6, 7, 4, 9, 3, 2, 5, 8]
  3. num=0
  4. d={}
  5. list3=[]
  6. jud=False
  7. while not jud:
  8.     jud=True
  9.     for each in list1:        
  10.         jud=jud and (each < 10)
  11.            
  12.     for each in list1:
  13.         if each >= 10:
  14.             for i in str(each):
  15.                 num +=int(i)
  16.         else:
  17.             num=each
  18.         list3.append(num)
  19.         num=0
  20.     list1=list3[:]
  21.     list3=[]
  22. for i in range(9):
  23.     d[list2[i]]=i
  24. list1.sort(key=lambda x:d[x])
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-7 19:06:41 | 显示全部楼层
list1 = [684, 6299800, 6041028, 2458660284, 937, 7857867, 384147026736, 888843160862, 270]
list2 = [1, 6, 7, 4, 9, 3, 2, 5, 8]
list3 = []
while not(set(list1) < set(list2) or set(list1) == set(list2)):
    for i in range(9):
        list1[i] = sum(map(int,list(str(list1[i]))))
for each in list2:
    for i in range(len(list1)):
        if list1[i] == each:
            list3.append(list1[i])
print(list3)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-8 00:32:20 | 显示全部楼层
需要什么基础才能写出,老师?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-18 11:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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