鱼C论坛

 找回密码
 立即注册
123
返回列表 发新帖
楼主: 冬雪雪冬

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

[复制链接]
发表于 2018-3-25 19:11:22 | 显示全部楼层
塔利班 发表于 2018-3-22 21:45
又写了个又臭又长的lambda

[5, 4, 6], [3, 6, 5], [2, 1, 1]
我测试了下,貌似你这lambda分不出上边大小.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-25 19:20:39 | 显示全部楼层
本帖最后由 塔利班 于 2018-3-25 19:25 编辑
冰封雪舞 发表于 2018-3-25 19:11
[5, 4, 6], [3, 6, 5], [2, 1, 1]
我测试了下,貌似你这lambda分不出上边大小.


好像是没分出来,我给的权值低了,那就10换20= =
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-25 19:30:12 | 显示全部楼层
冰封雪舞 发表于 2018-3-25 19:06
你这个纯属考颜值糊弄人,两个筛子仍一样的点数,按两个一样大小的筛子数值分大小,如果出现两个这种情况 ...

改了权值就对了,忘了考虑最小112和最大4,5,6情况了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-25 20:55:38 | 显示全部楼层
塔利班 发表于 2018-3-25 19:30
改了权值就对了,忘了考虑最小112和最大4,5,6情况了

恩,按照你这个公式,你那个权值好像只要大于12就可以了,佩服了,天才的思路,牛逼,给你点个赞。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-25 20:58:27 | 显示全部楼层
冰封雪舞 发表于 2018-3-25 20:55
恩,按照你这个公式,你那个权值好像只要大于12就可以了,佩服了,天才的思路,牛逼,给你点个赞。

没有,多谢指出错误,我写了第一种,第二种极限情况在脑子里过的不全,跟大家一起学习真好,
要不带着错误就忘了,
你也挺细心的,每个人的代码都敲下,我是超级囫囵吞枣。。哎,毛毛躁躁
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-27 16:54:29 | 显示全部楼层
nononoyes 发表于 2018-3-23 17:47
num  = input('请输入掷骰子的次数:')
num = int(num)
list1 = []

按照题目规则,(5,5,4)应该排在(6,1,6)前面才对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-27 16:58:12 | 显示全部楼层
  1. import itertools
  2. import random

  3. dicelist = list(itertools.product(range(1, 7), repeat=3))  # 生成骰子全部可能的排列点数,得到顺序排列的列表
  4. dicestatus = random.sample(dicelist, random.randint(2, 10))  # 打乱秩序,模拟随机掷出骰子得到的排列

  5. print("生成的随机骰子点数组合:")
  6. print(dicestatus)


  7. def tocompare(dice):
  8.     outlist = []
  9.     tlist = []
  10.     olist = []

  11.     # 查找(x,x,x)型组合
  12.     for x in dice:
  13.         if x[0] == x[1] == x[2]:
  14.             outlist.append(x)

  15.     outlist.sort(reverse=True)
  16.     # 查找(x,x,y)型组合
  17.     for y in dice:
  18.         if y[0] == y[1] and y[0] != y[2]:
  19.             tlist.append(y)
  20.     tlist.sort(reverse=True)
  21.     # 不符合上面两种类型的组合
  22.     for z in dice:
  23.         if z[0] != z[1]:
  24.             olist.append(z)

  25.     olist.sort(key=lambda x: sum(x), reverse=True) #根据每轮点数和的大小反向排序

  26.     return outlist + tlist + olist


  27. print("按照指定的大小规则排序:")
  28. print(tocompare(dicestatus))
复制代码

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

使用道具 举报

发表于 2018-3-27 17:44:13 | 显示全部楼层
凌九霄 发表于 2018-3-27 16:54
按照题目规则,(5,5,4)应该排在(6,1,6)前面才对

两个一样的,先比较两个一样的点数,如果还相同,再比较第三个的点数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-4 16:43:14 | 显示全部楼层
import random

i = 1
result=[]
same1=[]
same2=[]
same3=[]

while i <=20:
    a = random.randint (1,6)
    b = random.randint (1,6)
    c = random.randint (1,6)

    if a == b == c:
        same3.append((a,b,c))
    elif a == b or b == c or a == c:
        same2.append((a,b,c))
    else:
        same1.append((a,b,c))
   
    i += 1

same3.sort(key=lambda x:x[0],reverse=True)  # 按照第一个元素的大小排序
for each in same3:
    result.append(each)
   
mylist=[]
for k in range(len(same2)):
    for num in same2[k]:
        if same2[k].count(num) == 2:
            m=num
        elif same2[k].count(num) == 1:
            n=num
    mylist.append([m,n,k])

mylist.sort(key=lambda x:x[1],reverse=True) #先按n的大小排序
mylist.sort(key=lambda x:x[0],reverse=True) # 再按m的大小排序
for each in mylist:
    result.append(same2[each[2]])

same1.sort(key=sum,reverse=True)   # 按照元素的和的大小排序
for each in same1:
    result.append(each)

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

使用道具 举报

发表于 2018-5-12 14:21:00 | 显示全部楼层
def fun():
    lst = [(4, 1, 1), (2, 2, 2), (5, 6, 1), (4, 3, 6), (2, 4, 3), (1, 1, 1),
           (4, 3, 6), (6, 3, 3), (1, 3, 6), (4, 4, 3), (6, 2, 2), (1, 5, 2),
           (5, 6, 6), (1, 4, 6), (2, 1, 6), (1, 3, 3), (6, 6, 5)]
    lst1 = []
    lst2 = []
    lst3 = []
   
    for i in lst:
        if len(set(i)) == 3:
            lst3.append(i)
        elif len(set(i)) == 2:
            lst2.append(i)
        else:
            lst1.append(i)
    lst1 = sorted(lst1, key = lambda x: max(x), reverse = True)
    def fun2(x):
        if x[0] == x[1] or x[1] == x[2]:
            return x[1]
        else :
            return x[0]
    lst2 = sorted(lst2, key = fun2, reverse = True)
    lst3 = sorted(lst3, key = sum, reverse = True)
    print(lst1,lst2,lst3)
fun()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-28 17:01:40 | 显示全部楼层
本帖最后由 776667 于 2018-6-28 17:04 编辑
  1. from random import randint

  2. def fun169(x):
  3.     list_dice_all = []
  4.     for i in range(x):
  5.         dice = [randint(1,6) for i in range(3)]
  6.         list_dice_all.append(tuple(dice))        
  7.     list_dice_three = sorted([i for i in list_dice_all if len(set(i)) == 1])[::-1]   
  8.     list_dice_two = [i for i in list_dice_all if len(set(i)) == 2]   
  9.     list_dice_nope = [i for i in list_dice_all if len(set(i)) == 3]
  10.     list_dice_nope.sort(key=lambda x:sum(x),reverse=True)
  11.     list_dice_two_sorted = []
  12.     for i in range(1,7)[::-1]:
  13.         for j in range(1,7)[::-1]:
  14.             for n in list_dice_two:
  15.                 if n.count(i) == 2 and n.count(j) == 1:
  16.                     list_dice_two_sorted.append(n)
  17.     return list_dice_three + list_dice_two_sorted + list_dice_nope

  18. if __name__ == '__main__':
  19.     x = input('请输入掷骰次数:')
  20.     print(fun169(int(x)))
复制代码
  1. 请输入掷骰次数:30
  2. [(5, 5, 5), (6, 6, 4), (2, 6, 6), (6, 1, 6), (5, 5, 3), (5, 5, 2), (4, 4, 3), (3, 3, 6), (3, 3, 4), (1, 1, 3), (3, 6, 4), (6, 4, 3), (6, 4, 2), (6, 1, 5), (3, 5, 4), (4, 5, 3), (2, 4, 6), (2, 3, 6), (6, 2, 3), (1, 6, 4), (6, 2, 3), (6, 3, 2), (1, 6, 3), (6, 1, 3), (2, 5, 3), (4, 3, 2), (4, 2, 3), (1, 4, 3), (1, 4, 2), (1, 2, 4)]
  3. >>>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-20 20:31:09 | 显示全部楼层
  1. import random

  2. list1 = [1,2,3,4,5,6]
  3. list3 = []

  4. #生成结果列表
  5. for i in range(8):
  6.     list2 = []
  7.     for j in range(3):
  8.         data = random.choice(list1)
  9.         list2.append(data)
  10.     list3.append(tuple(list2))

  11. list4 = []
  12. list5 = []
  13. list6 = []

  14. for each in list3:
  15.    
  16.     #三个点数一样
  17.     if each[0] == each[1] == each[2]:
  18.         list4.append(each)
  19.         list4.sort()
  20.         list4.reverse()
  21.         
  22.     #有两个点数一样  
  23.     elif each[0] == each[1] or each[0]== each[2] or each[1] == each[2]:
  24.         list5.append(each)
  25.         list8 = []
  26.         for each in list5:
  27.             if each[0] == each[1]:
  28.                 list8.append(each)
  29.             elif each[0]== each[2]:
  30.                 tup = (each[0],each[2],each[1])
  31.                 list8.append(tup)
  32.             elif each[1] == each[2]:
  33.                 tup = (each[1],each[2],each[0])
  34.                 list8.append(tup)
  35.                      
  36.         list8.sort()
  37.         list8.reverse()
  38.         
  39.     #点数都不相同   
  40.     else:
  41.         list6.append(each)
  42.         dict1 = {}
  43.         Sum_list = []
  44.         list7 = []
  45.         for each in list6:
  46.             Sum = each[0] + each[1] + each[2]
  47.             Sum_list.append(Sum)
  48.             dict1[Sum] = each
  49.         Sum_list.sort()
  50.         Sum_list.reverse()
  51.         for each in Sum_list:
  52.             list7.append(dict1[each])

  53. print(list4+list8+list7)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-4 17:58:14 | 显示全部楼层
  1. def fun_169(m):
  2.     list1=[]
  3.     list2=[]
  4.     list3=[]
  5.     for i in m:
  6.         if i[0]==i[1] and i[1]==i[2]:
  7.             list1.append(i)
  8.         elif i[0]==i[1] or i[1]==i[2] or i[2]==i[0]:
  9.             list2.append(i)
  10.         else:
  11.             list3.append(i)#将三种分别放入三个列表中
  12.     list1=sorted(list1,reverse=True)#列表1排序
  13.     temp=max(list(max(j) for j in list2))+1
  14.     for k in range(len(list2)):
  15.         if list2[k][0]==list2[k][1]:
  16.             list2[k]=(list2[k][0]*temp+list2[k][2],)+list2[k]
  17.         elif list2[k][1]==list2[k][2]:
  18.             list2[k]=(list2[k][1]*temp+list2[k][0],)+list2[k]
  19.         else:
  20.             list2[k]=(list2[k][2]*temp+list2[k][1],)+list2[k]
  21.     list2=sorted(list2,reverse=True)
  22.     for p in range(len(list2)):
  23.         list2[p]=list2[p][1:]#列表2排序,原理:先从每一组中演化出一个数字,即相同的那个数乘以temp再加上余下的那个数,将此数添加到每组的最前面,排序后再删去
  24.     for l in range(len(list3)):
  25.         list3[l]=(sum(list3[l]),)+list3[l]
  26.     list3=sorted(list3,reverse=True)
  27.     for q in range(len(list3)):
  28.         list3[q]=list3[q][1:]#列表3排序
  29.     list1.extend(list2)
  30.     list1.extend(list3)
  31.     print(list1)
  32. fun_169([(4,1,1),(2,2,2),(5,6,1),(4,3,6),(2,4,3),(1,1,1),(4,3,6),(6,3,3),(1,3,6),(4,4,3),(6,2,2),(1,5,2),(5,6,6),(1,4,6),(2,1,6),(1,3,3),(6,6,5)])
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-25 23:27:59 | 显示全部楼层
  1. import random


  2. def getRollScore():
  3.         rollTime = 20
  4.         list1, list2, list3 = [], [], []
  5.         for i in range(rollTime):
  6.                 list1.append((random.randint(1, 6), random.randint(1, 6), random.randint(1, 6)))
  7.         print('原始点数列表:', end='')
  8.         print(list1, end='\n-----------\n')
  9.         for i in list1[:]:
  10.                 if len(set(i)) == 3:
  11.                         list3.append(i)
  12.                         list1.remove(i)
  13.                 elif len(set(i)) == 2:
  14.                         list2.append(i)
  15.                         list1.remove(i)
  16.         if len(list3) > 1:
  17.                 numCompare(list3)
  18.         if len(list2) > 1:
  19.                 for i in range(len(list2) - 1):
  20.                         tempTup = ()
  21.                         for j in range(len(list2) - i - 1):
  22.                                 if (sum(list2[j]) - sum(set(list2[j]))) < (sum(list2[j + 1]) - sum(set(list2[j + 1]))):
  23.                                         tempTup = list2[j]
  24.                                         list2[j] = list2[j + 1]
  25.                                         list2[j + 1] = tempTup
  26.                                 elif (sum(list2[j]) - sum(set(list2[j]))) == (
  27.                                         sum(list2[j + 1]) - sum(set(list2[j + 1]))):
  28.                                         if sum(list2[j]) < sum(list2[j + 1]):
  29.                                                 tempTup = list2[j]
  30.                                                 list2[j] = list2[j + 1]
  31.                                                 list2[j + 1] = tempTup
  32.         if len(list1) > 1:
  33.                 numCompare(list1)
  34.         for i in list2:
  35.                 list1.append(i)
  36.         for i in list3:
  37.                 list1.append(i)
  38.         print('排序后的列表:', end='')
  39.         print(list1)


  40. def numCompare(list1):
  41.         for i in range(len(list1) - 1):
  42.                 tempTup = ()
  43.                 for j in range(len(list1) - i - 1):
  44.                         if sum(list1[j]) < sum(list1[j + 1]):
  45.                                 tempTup = list1[j]
  46.                                 list1[j] = list1[j + 1]
  47.                                 list1[j + 1] = tempTup
  48.         return list1


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

使用道具 举报

发表于 2022-9-7 14:15:13 | 显示全部楼层
本帖最后由 kinkon 于 2022-9-7 14:39 编辑
  1. from collections import Counter
  2. def f169(arr):
  3.     p3, p2, p1 = list(),list(),list()
  4.     for a in arr:
  5.         if a[0] == a[1] == a[2]:
  6.             p3.append(a)
  7.         elif a[0] != a[1] != a[2]:
  8.             p1.append(a)
  9.         else:
  10.             p2.append(a)
  11.     p3.sort(reverse = True)
  12.     p2.sort(key=lambda x: x[0] if x[0] == x[1] or x[0] == x[2] else x[1], reverse = True)
  13.     p1.sort(key=sum, reverse = True)

  14.     return p3 + p2 + p1

  15. arr = [(4, 1, 1), (2, 2, 2), (5, 6, 1), (4, 3, 6), (2, 4, 3), (1, 1, 1), (4, 3, 6), (6, 3, 3), (1, 3, 6), (4, 4, 3), (6, 2, 2), (1, 5, 2), (5, 6, 6), (1, 4, 6), (2, 1, 6), (1, 3, 3), (6, 6, 5)]
  16. print(f169(arr))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 12:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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