鱼C论坛

 找回密码
 立即注册
查看: 7278|回复: 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 编辑
list1 = [684, 6299800, 6041028, 2458660284, 937, 7857867, 384147026736, 888843160862, 270]
list2 = [1, 6, 7, 4, 9, 3, 2, 5, 8]
order = {n:i for i,n in enumerate(list2)}

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

list1.sort(key=x)
print(list1)
#[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 | 显示全部楼层
#数字n先求出各位之和,如果结果不是一位数,继续此步骤,直到成为1~9的数字
def sumbit(n):
    while n > 9:
        total = 0
        for each in list(str(n)):
            total += eval(each)
        n = total
    return n

#序列list1按照序列list2的顺序排列
def sortlist(list1,list2):
    list3 = [[sumbit(x),x] for x in list1] 
    list4 = []
    for i in list2:
        for j in range(len(list3)):
            if i == list3[j][0]:
                list4.append(list3[j][1])
    return list4

list1 = [684, 6299800, 6041028, 2458660284, 937, 7857867, 384147026736, 888843160862, 270]
list2 = [1, 6, 7, 4, 9, 3, 2, 5, 8]
print(sortlist(list1,list2))

评分

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

查看全部评分

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

使用道具 举报

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

tar = []

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

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

使用道具 举报

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

    else:
        new_num = 0
        for each in str(num):
            new_num += int(each)
        return get_index(new_num)

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

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

sorted_order = sorted(num_order)

new_list = []
for each in sorted_order:
    new_list.append(list1[num_order.index(each)])
    list1.remove(list1[num_order.index(each)])
    num_order.remove(each)

print(new_list)

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

评分

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

查看全部评分

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

使用道具 举报

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

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

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

list4 = [d[i] for i in list2 if i in d.keys()]
from itertools import chain
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 | 显示全部楼层
list1 = [684, 6299800, 6041028, 2458660284, 937, 7857867, 384147026736, 888843160862, 270]
list2 = []

def doit(i):
    add = 0
    sum1 = list(str(i))
    for j in sum1:
        add = add + int(j)
    return add

def sort(in_list):
    for j in range(len(in_list)) :
        if in_list[j] == 1:
            in_list[j] = 1
        elif in_list[j] == 6:
            in_list[j] = 2
        elif in_list[j] == 7:
            in_list[j] = 3
        elif in_list[j] == 4:
            in_list[j] = 4
        elif in_list[j] == 9:
            in_list[j] = 5
        elif in_list[j] == 3:
            in_list[j] = 6
        elif in_list[j] == 2:
            in_list[j] = 7
        elif in_list[j] == 5:
            in_list[j] = 8
        elif in_list[j] == 8:
            in_list[j] = 9
    return in_list
        
    

for i in list1:
    add = doit(i)
    while add > 9 :
        add = doit(add)
    list2.append(add)

list2 = sort(list2)

#list2.sort()
    
print(list2)


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

使用道具 举报

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

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

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

使用道具 举报

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

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

使用道具 举报

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

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

result
[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 | 显示全部楼层
list1 = [684, 6299800, 6041028, 2458660284, 937, 7857867, 384147026736, 888843160862, 270]
list2=[]
list3=[]
list4=[1, 6, 7, 4, 9, 3, 2, 5, 8]
he=0
def fun(list1):

    for i in list1:
        he=sum(map(int,str(i)))
        if he <=9:
            list2.append(he)
            
        else:
            list1=[]
            list1.append(he)
            fun(list1)
            
    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]
# -*- coding: utf-8 -*-
"""
Created on Mon Nov  6 15:59:02 2017

"""
import numpy as np


def numSum(Num):
    NumOfDigitals = int(np.log10(Num))
    numAdd=0;
    for i in range(NumOfDigitals, 0, -1):
        if ( i == NumOfDigitals):
            Digital = int(Num / pow(10, i))
            numAdd=Digital
            remain = Num - Digital*pow(10,i)
        else:
            Digital = int(remain / pow(10, i))
            numAdd += Digital
            remain = remain - Digital*pow(10,i)
    
    return numAdd + remain

def digitalSum(Num):
    dig_sum = Num
    while(dig_sum > 9):
        dig_sum = numSum(dig_sum)
    return dig_sum
        
list1 = [684, 6299800, 6041028, 2458660284, 937, 7857867, 384147026736, 888843160862, 270]

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


nlist1=[]

for i in list1:
    dig_sum = digitalSum(i)
    if(len(nlist1)==0):
        nlist1.append(dig_sum)
    else:
        index_j = 0
        flag=0
        order_old = list2.index(nlist1[index_j])
        order_new = list2.index(dig_sum)
        while (order_new > order_old and flag==0): #and index_j<len(nlist1)-1):
            index_j = index_j + 1
            if (index_j < len(nlist1)):
                order_old = list2.index(nlist1[index_j])
            else:
                flag=1

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

使用道具 举报

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

def add2(x, y):
    return int(x) + int(y)
def CaiFen(element):
    a = element
    while a > 9:
        a = int(reduce(add2,list(str(a))))
    return a
g=[]
for i in list1:
    g.append(CaiFen(i))
z=zip(g,list1)
dic={}
for k,v in z:
    dic[v]=k
l=[]
list2 = [1, 6, 7, 4, 9, 3, 2, 5, 8]
for i in list2:
    for v,k in dic.items():
        if i == k:
            l.append(v)
print(l)
代码感觉写的有点长,没有精简。

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-11-7 11:39:10 | 显示全部楼层
list1= [684,6299800,6041028,2458660284, 937,7857867,384147026736,888843160862,270]
list2 = [1, 6, 7, 4, 9, 3, 2, 5, 8]
num=0
d={}
list3=[]
jud=False
while not jud:
    jud=True
    for each in list1:        
        jud=jud and (each < 10)
           
    for each in list1:
        if each >= 10:
            for i in str(each):
                num +=int(i)
        else:
            num=each
        list3.append(num)
        num=0
    list1=list3[:]
    list3=[]
for i in range(9):
    d[list2[i]]=i
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, 2025-1-12 06:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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