鱼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 | 显示全部楼层
import itertools
import random

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

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


def tocompare(dice):
    outlist = []
    tlist = []
    olist = []

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

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

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

    return outlist + tlist + olist


print("按照指定的大小规则排序:")
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 编辑
from random import randint

def fun169(x):
    list_dice_all = []
    for i in range(x):
        dice = [randint(1,6) for i in range(3)]
        list_dice_all.append(tuple(dice))        
    list_dice_three = sorted([i for i in list_dice_all if len(set(i)) == 1])[::-1]    
    list_dice_two = [i for i in list_dice_all if len(set(i)) == 2]   
    list_dice_nope = [i for i in list_dice_all if len(set(i)) == 3]
    list_dice_nope.sort(key=lambda x:sum(x),reverse=True)
    list_dice_two_sorted = []
    for i in range(1,7)[::-1]:
        for j in range(1,7)[::-1]:
            for n in list_dice_two:
                if n.count(i) == 2 and n.count(j) == 1:
                    list_dice_two_sorted.append(n)
    return list_dice_three + list_dice_two_sorted + list_dice_nope

if __name__ == '__main__':
    x = input('请输入掷骰次数:')
    print(fun169(int(x)))
请输入掷骰次数:30
[(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)]
>>> 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

list4 = []
list5 = []
list6 = []

for each in list3:
    
    #三个点数一样
    if each[0] == each[1] == each[2]:
        list4.append(each)
        list4.sort()
        list4.reverse()
        
    #有两个点数一样  
    elif each[0] == each[1] or each[0]== each[2] or each[1] == each[2]:
        list5.append(each)
        list8 = []
        for each in list5:
            if each[0] == each[1]:
                list8.append(each)
            elif each[0]== each[2]:
                tup = (each[0],each[2],each[1])
                list8.append(tup)
            elif each[1] == each[2]:
                tup = (each[1],each[2],each[0])
                list8.append(tup)
                      
        list8.sort()
        list8.reverse()
        
    #点数都不相同   
    else:
        list6.append(each)
        dict1 = {}
        Sum_list = []
        list7 = []
        for each in list6:
            Sum = each[0] + each[1] + each[2]
            Sum_list.append(Sum)
            dict1[Sum] = each
        Sum_list.sort()
        Sum_list.reverse()
        for each in Sum_list:
            list7.append(dict1[each])

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

使用道具 举报

发表于 2018-9-4 17:58:14 | 显示全部楼层
def fun_169(m):
    list1=[]
    list2=[]
    list3=[]
    for i in m:
        if i[0]==i[1] and i[1]==i[2]:
            list1.append(i)
        elif i[0]==i[1] or i[1]==i[2] or i[2]==i[0]:
            list2.append(i)
        else:
            list3.append(i)#将三种分别放入三个列表中
    list1=sorted(list1,reverse=True)#列表1排序
    temp=max(list(max(j) for j in list2))+1
    for k in range(len(list2)):
        if list2[k][0]==list2[k][1]:
            list2[k]=(list2[k][0]*temp+list2[k][2],)+list2[k]
        elif list2[k][1]==list2[k][2]:
            list2[k]=(list2[k][1]*temp+list2[k][0],)+list2[k]
        else:
            list2[k]=(list2[k][2]*temp+list2[k][1],)+list2[k]
    list2=sorted(list2,reverse=True)
    for p in range(len(list2)):
        list2[p]=list2[p][1:]#列表2排序,原理:先从每一组中演化出一个数字,即相同的那个数乘以temp再加上余下的那个数,将此数添加到每组的最前面,排序后再删去
    for l in range(len(list3)):
        list3[l]=(sum(list3[l]),)+list3[l]
    list3=sorted(list3,reverse=True)
    for q in range(len(list3)):
        list3[q]=list3[q][1:]#列表3排序
    list1.extend(list2)
    list1.extend(list3)
    print(list1)
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 | 显示全部楼层
import random


def getRollScore():
        rollTime = 20
        list1, list2, list3 = [], [], []
        for i in range(rollTime):
                list1.append((random.randint(1, 6), random.randint(1, 6), random.randint(1, 6)))
        print('原始点数列表:', end='')
        print(list1, end='\n-----------\n')
        for i in list1[:]:
                if len(set(i)) == 3:
                        list3.append(i)
                        list1.remove(i)
                elif len(set(i)) == 2:
                        list2.append(i)
                        list1.remove(i)
        if len(list3) > 1:
                numCompare(list3)
        if len(list2) > 1:
                for i in range(len(list2) - 1):
                        tempTup = ()
                        for j in range(len(list2) - i - 1):
                                if (sum(list2[j]) - sum(set(list2[j]))) < (sum(list2[j + 1]) - sum(set(list2[j + 1]))):
                                        tempTup = list2[j]
                                        list2[j] = list2[j + 1]
                                        list2[j + 1] = tempTup
                                elif (sum(list2[j]) - sum(set(list2[j]))) == (
                                        sum(list2[j + 1]) - sum(set(list2[j + 1]))):
                                        if sum(list2[j]) < sum(list2[j + 1]):
                                                tempTup = list2[j]
                                                list2[j] = list2[j + 1]
                                                list2[j + 1] = tempTup
        if len(list1) > 1:
                numCompare(list1)
        for i in list2:
                list1.append(i)
        for i in list3:
                list1.append(i)
        print('排序后的列表:', end='')
        print(list1)


def numCompare(list1):
        for i in range(len(list1) - 1):
                tempTup = ()
                for j in range(len(list1) - i - 1):
                        if sum(list1[j]) < sum(list1[j + 1]):
                                tempTup = list1[j]
                                list1[j] = list1[j + 1]
                                list1[j + 1] = tempTup
        return list1


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

使用道具 举报

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

    return p3 + p2 + p1

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)]
print(f169(arr))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-16 20:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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