鱼C论坛

 找回密码
 立即注册
查看: 6950|回复: 57

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

[复制链接]
发表于 2018-3-22 19:25:06 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 冬雪雪冬 于 2018-3-24 20:58 编辑

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

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

题目:
这回我们来掷骰子,每轮掷3个骰子,多轮掷后,将骰子的点数记为一个列表,例如:
[(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)]
现在要将每轮的掷骰子的情况由大到小排序,规则是,三个一样的最大,两个一样的次之,然后是都不一样的。三个一样的最大再以点数排序,两个一样的,先比较两个一样的点数,如果还相同,再比较第三个的点数,都不一样的按点数之后。
例如:(6,6,6)>(1,1,1)>(5,5,2)>(4,4,6)>(6,5,4)>(3,2,1)
最后给出按此规则排序的列表。
注:点数相同的排序次序不限,如(6,3,1)和(5,4,1)谁排在前面都行。

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2018-3-22 20:10:34 | 显示全部楼层
本帖最后由 第四时空 于 2018-3-22 21:54 编辑

修改
  1. from collections import Counter

  2. if __name__ == '__main__':
  3.     li = [(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)]
  4.     li2 = sorted(li, key=lambda x: (-len(set(x)), sum(x) if len(set(x)) == len(x) else Counter(x).most_common(1)[0][0]), reverse=True)
  5.     print(li2)
复制代码

点评

没有考虑2个一样的大于三个不同的  发表于 2018-3-22 20:13

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-3-22 21:26:07 | 显示全部楼层
本帖最后由 新手·ing 于 2018-3-23 18:13 编辑
  1. def fuck(lst):
  2.     lstd = sorted([x for x in lst if x[0] == x[1] == x[2]], reverse=True)
  3.     lssd = sorted([y for y in lst if (sorted(y)[0] == sorted(y)[1] or sorted(y)[2] == sorted(y)[1]) and y not in lstd], key=lambda y: y[0] if y.count(y[0]) == 2 else y[2], reverse=True)
  4.     lsnn = sorted([z for z in lst if z not in lstd and z not in lssd], key=sum, reverse=True)
  5.     return lstd + lssd + lsnn
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-3-22 21:29:29 | 显示全部楼层
本帖最后由 塔利班 于 2018-3-22 22:01 编辑
  1. def rank(x):
  2.     a=len(set(x))
  3.     if a==1:
  4.         return sum(x)*100
  5.     if a==2:
  6.         return sum(x)+18*(sum(x)-sum(set(x)))
  7.     if a==3:
  8.         return sum(x)
  9. L=[(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), \
  10.    (5, 6, 6), (1, 4, 6), (2, 1, 6), (1, 3, 3), (6, 6, 5)]
  11. t=sorted(L,key=rank,reverse=True)
复制代码

点评

比较一下,(1,1,6)和(2,2,1)谁大?  发表于 2018-3-22 21:38

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-3-22 21:45:10 | 显示全部楼层
本帖最后由 塔利班 于 2018-3-25 19:26 编辑


又写了个又臭又长的lambda

  1. L=[(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), \
  2.    (5, 6, 6), (1, 4, 6), (2, 1, 6), (1, 3, 3), (6, 6, 5)]
  3. s=sorted(L,key=lambda x :sum(x)+20**(3-len(set(x)))*(sum(x)-sum(set(x))),reverse=True)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-22 22:06:05 | 显示全部楼层
本帖最后由 Chase_Kas 于 2018-3-24 22:09 编辑

加了一个反向排序的参数,刚好学到了魔法方法里面提到了异或,这里用上了美滋滋,使得反向排序异常的简单
突然想起对于列表list1,list1.reverse()不就可以反向了嘛。。被自己蠢到了23333
  1. # 对每组点数进行评分,三个点数一样的分数+1000,两个一样的+100,全都不一样的没有加分。
  2. # 这样各个组别的分数相差巨大,而且组内不同点数评分还有差异,这样每组点数的大小就很直观了(是不是我的脑回路比较清奇...)
  3. def score(each):
  4.    
  5.     if set(each) == 1:
  6.         return each[0] + 1000
  7.     elif  set(each) == 2:
  8.         return (each[1]+6)**2 + (each[0] if each[1] == each[2] else each[2]) + 100
  9.     else:
  10.         return each[0] + each[1] + each[2]

  11. # 冒泡排序,引入reverse进行反向排序。
  12. def mysorted(point_list, reverse=False):

  13.     for i in range(len(point_list) - 1):
  14.         for j in range(len(point_list) - 1 - i):
  15.             if (score(point_list[j]) < score(point_list[j+1])) ^ reverse:
  16.                 point_list[j], point_list[j+1] = point_list[j+1], point_list[j]
  17.    
  18.     return point_list

  19. a = [(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)]
  20. print(mysorted(a))
  21. print(mysorted(a, reverse=True))
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-3-22 22:38:31 | 显示全部楼层
  1. import random
  2. def make_points(number):
  3.         list1 = []
  4.         for i in range(number):
  5.                 x = random.randint(1,6)
  6.                 y = random.randint(1,6)
  7.                 z = random.randint(1,6)
  8.                 temp = []
  9.                 temp.append(x)
  10.                 temp.append(y)
  11.                 temp.append(z)
  12.                 temp = tuple(sorted(temp,reverse=True))
  13.                 list1.append(temp)
  14.        
  15.         return list1


  16. def strong_weak(tuple1):
  17.         temp = set(tuple1)
  18.         if len(temp) == 1:
  19.                 return 3
  20.         elif len(temp) == 2:
  21.                 return 2
  22.         else:
  23.                 return 1

  24. def sort_list(list1):
  25.         result3 = []#盛放3个元素相同
  26.         result2 = []#盛放2个元素相同
  27.         result1 = []#盛放1个元素的
  28.         for each in list1:
  29.                 if strong_weak(each) == 3:
  30.                         result3.append(each)
  31.                 if strong_weak(each) == 2:
  32.                         temp = []
  33.                         if each[0] == each[1]:
  34.                                 temp.append(each[0])
  35.                                 temp.append(each[1])
  36.                                 temp.append(each[2])
  37.                         if each[0] == each[2]:
  38.                                 temp.append(each[0])
  39.                                 temp.append(each[2])
  40.                                 temp.append(each[1])
  41.                         if each[1] == each[2]:
  42.                                 temp.append(each[1])
  43.                                 temp.append(each[2])
  44.                                 temp.append(each[0])
  45.                         each = tuple(temp)
  46.                         result2.append(each)
  47.                 if strong_weak(each) == 1:
  48.                         result1.append(each)

  49.        
  50.         result3 = sorted(result3,reverse=True)
  51.         result2 = sorted(result2,reverse=True)
  52.         result1 = sorted(result1,reverse=True)

  53.         result = []
  54.         result.extend(result3)
  55.         result.extend(result2)
  56.         result.extend(result1)

  57.         return result

  58. if __name__ == '__main__':
  59.         number = int(input('请输入要实验多少组:'))
  60.         list1 = make_points(number)
  61.         print(sort_list(list1))

  62. 运行结果:
  63. 请输入要实验多少组:30
  64. [(5, 5, 5), (6, 6, 4), (6, 6, 4), (6, 6, 3), (6, 6, 3), (6, 6, 1), (6, 6, 1), (5, 5, 4), (5, 5, 3), (5, 5, 2), (5, 5, 1), (4, 4, 6), (4, 4, 2), (4, 4, 2), (3, 3, 6), (2, 2, 6), (2, 2, 5), (2, 2, 5), (2, 2, 3), (1, 1, 5), (6, 4, 2), (6, 4, 1), (6, 4, 1), (6, 3, 2), (5, 4, 3), (5, 4, 2), (5, 4, 2), (5, 4, 1), (5, 3, 2), (4, 2, 1)]

  65. ***Repl Closed***
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-3-22 22:54:18 | 显示全部楼层
  1. import random


  2. def sort_dices(die):
  3.     die_score = []
  4.     for each in die:
  5.         if each[0] == each[1] == each[2]:
  6.             die_score.append(100 * each[0])
  7.         elif each[0] == each[1]:
  8.             die_score.append(each[0] * 15 + each[2])
  9.         elif each[0] == each[2]:
  10.             die_score.append(each[0] * 15 + each[1])
  11.         elif each[1] == each[2]:
  12.             die_score.append(each[1] * 15 + each[0])
  13.         else:
  14.             die_score.append(each[0] + each[1] + each[2])
  15.     sortdie_score = sorted(die_score, reverse=True)
  16.     final_list = []
  17.     for k in range(len(die)):
  18.         final_list.append(die[die_score.index(sortdie_score[k])])
  19.     return final_list


  20. dices = []
  21. for i in range(20):
  22.     dic1 = []
  23.     for j in range(3):
  24.         dic1.append(random.randint(1, 6))
  25.     dices.append(tuple(dic1))

  26. print dices
  27. print sort_dices(dices)
复制代码


=======
每个骰子元组计算排序的权重分数
三个一样的数字,重复数字权重100
两个一样的数字,重复数字权重 15
都不一样,直接算和

最后按权重排序

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-3-22 22:55:35 | 显示全部楼层
  1. #定义每轮掷骰子的三个结果组成的元组的权值,比如(6,6,6)权值为3,(4,4,6)权值为2,(6,5,4)为1
  2. def weight(t):
  3.     if t[0] == t[1] and t[1] == t[2]:
  4.         return 3
  5.     elif t.count(t[0]) == 2 or t.count(t[1]) == 2:
  6.         return 2
  7.     else:
  8.         return 1


  9. #比较两次掷骰子的结果组成的元组的排序顺序,t1排前面返回True,t2排前面返回False
  10. def comp(t1,t2):
  11.     if weight(t1) > weight(t2):
  12.         return True
  13.     elif weight(t1) < weight(t2):
  14.         return False
  15.     else:
  16.         #若权值相等,则按权值分情况进行比较
  17.         if weight(t1) == 3:
  18.             if t1[0] > t2[0]:
  19.                 return True
  20.             else:
  21.                 return False
  22.             
  23.         elif weight(t1) == 2:
  24.             #如t1为(4,4,6),则list1为[4,6];t2为(1,3,1),则list2为[1,3]
  25.             list1 = []
  26.             if t1[0] == t1[1]:
  27.                 list1.append(t1[0])
  28.                 list1.append(t1[2])
  29.             elif t1[1] == t1[2]:
  30.                 list1.append(t1[1])
  31.                 list1.append(t1[0])
  32.             else:
  33.                 list1.append(t1[0])
  34.                 list1.append(t1[1])
  35.                
  36.             list2 = []
  37.             if t2[0] == t2[1]:
  38.                 list2.append(t2[0])
  39.                 list2.append(t2[2])
  40.             elif t2[1] == t2[2]:
  41.                 list2.append(t2[1])
  42.                 list2.append(t2[0])
  43.             else:
  44.                 list2.append(t2[0])
  45.                 list2.append(t2[1])

  46.             if list1[0] > list2[0]:
  47.                 return True
  48.             elif list1[0] == list2[0]:
  49.                 if list1[1] > list2[1]:
  50.                     return True
  51.                 else:
  52.                     return False
  53.             else:
  54.                 return False
  55.         
  56.         else:
  57.             sum1 = t1[0] + t1[1] + t1[2]
  58.             sum2 = t2[0] + t2[1] + t2[2]
  59.             if sum1 > sum2:
  60.                 return True
  61.             else:
  62.                 return False


  63. #冒泡排序
  64. def my_sort(old):
  65.     length =len(old)
  66.     for i in range(length-1):
  67.         for j in range(length-2,-1,-1):
  68.             if not comp(old[j],old[j+1]):
  69.                 t = old[j]
  70.                 old[j] = old[j+1]
  71.                 old[j+1] = t


  72. import random as r
  73. count = int(input('请输入要投掷骰子的轮数:'))
  74. my_list = []
  75. for i in range(count):
  76.     list1 = []
  77.     for j in range(3):
  78.         list1.append(r.randint(1,6))
  79.     tuple1 = tuple(list1)
  80.     my_list.append(tuple1)   
  81. print('投掷'+ str(count) + '轮骰子的结果为:\n',my_list)
  82. my_sort(my_list)
  83. print('排序后的结果为:\n',my_list)
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-3-23 00:17:00 | 显示全部楼层
list1 = [(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)]
def px(list1):
    df = []
    for i in range(len(list1)):
        num = 0
        if list1[i][0] == list1[i][1] and list1[i][1] == list1[i][2]:
            num += 36
        elif list1[i][0] == list1[i][1] or list1[i][1] == list1[i][2]:
            num += 18
        for j in range(3):
            num += list1[i][j]
        df.append(num)
    #print(df)
    #print(len(list1))
    print(max1(df,list1))

def max1(list1,list2):
    rpx = []
    for j in range(len(list1)):
        max2 = 0
        max_num = 0
        for i in range(len(list1)):
            if list1[i] > max2:
                max2 = list1[i]
                max_num = i
        list1[max_num] = 0
        rpx.append(list2[max_num])
    return rpx
px(list1)

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-3-23 00:22:19 | 显示全部楼层
jilu=[]
for i in dianshu :
    if i[0]==i[1]==i[2] :
        i=(3,i[0])+i
    elif (i[0]!=i[1])and(i[1]!=i[2])and(i[0]!=i[2]) :
        i=(1,i[0]+i[1]+i[2])+i
    elif (i[0]==i[1]) :
        i=(2,i[0]*10+i[2])+i
    elif (i[1]==i[2]) :
        i=(2,i[2]*10+i[0])+i
    elif (i[0]==i[2]) :
        i=(2,i[0]*10+i[2])+i
    jilu.append(i)
jilu.sort(reverse=True)
for i in range(len(jilu)):
    jilu[i]=jilu[i][2:]
print(jilu)

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-3-23 08:06:17 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-23 09:43:39 | 显示全部楼层
本帖最后由 天圆突破 于 2018-3-23 09:50 编辑
  1. from random import randint
  2. def dct(n):
  3.     lstf, lst3, lst2, lst = list(), list(), list(), list()
  4.     for i in range(n):
  5.         a = list(str(randint(1,6)) for i in range(3))
  6.         lstf.append(tuple(int(i) for i in a))
  7.         b = sorted(a, reverse = True)
  8.         if b[0] == b[1] == b[2]:
  9.             lst3.append(''.join(b))
  10.         elif b[0] == b[1]:
  11.             lst2.append(''.join(b))
  12.         elif b[1] == b[2]:
  13.             lst2.append(''.join(reversed(b)))
  14.         else:
  15.             lst.append(''.join(b))
  16.     lst.sort(reverse=True)
  17.     lst2.sort(reverse=True)
  18.     lst3.sort(reverse=True)
  19.     return lstf, list(tuple((int(j) for j in list(i))) for i in lst3) + list(tuple((int(j) for j in list(i))) for i in lst2) + list(tuple((int(j) for j in list(i))) for i in lst)
复制代码
  1. if __name__ == '__main__':
  2.     print('掷骰后的结果是:\t%s\n排序后的列表是:\t%s'%(dct(11)))
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-3-23 10:18:51 | 显示全部楼层
import random

list = []

k=0
while k <10:
    list1 = []
    for num in range(3):
        i = random.randint(1,6)
        list1.append(i)
    print(list1)
    list.append(list1) #list1是单一元素看待
    k+=1
print(list)
list2=[]
list3=[]
list4=[]
for i in range(10):
    if list[i][1]==list[i][2]==list[i][0]:

        list2.append(list[i])
        list2.sort(reverse=True)

    elif list[i][1]==list[i][2] or list[i][2]==list[i][0] or list[i][1]==list[i][0]:
        while not list[i][0]==list[i][1]:
            list[i].append(list[i][0])
            list[i].pop(0)
        list3.append(list[i])
        list3.sort(reverse=True)



    elif list[i][1]!=list[i][2]:
        list4.append(list[i])

j= 1
list5=[]
len = len(list4)
while j < len:
    for k in range(len-j):
        if sum(list4[0])> sum(list4[1]):
            list4.append(list4[1])
            list4.pop(1)
        else:
            list4.append(list4[0])
            list4.pop(0)
    list5.append(list4.pop(0))
    j+=1




list2.extend(list3)
list2.extend(list5)
list2.extend(list4)
print(list2)

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-3-23 13:33:51 | 显示全部楼层
import random

def List_sz(n):
        #n组骰子
        list_sz = []
        while n > 0:
                n -= 1
                list1 = [random.randint(1,6),random.randint(1,6),random.randint(1,6)]
                list_sz.append(list1)
        return list_sz

def Rank(list_sz):
        list1 = []
        list2 = []
        list3 = []
        list3_1 = []
        list3_2 = []
        list3_3 = []
        list_rank = []
        #把数组分为三类
        for each in list_sz:
                if each[0] == each[1] == each[2]:
                        list1.append(each)
                elif each[0] == each[1]:
                        list2.append(each)
                elif each[1] == each[2]:
                        each[0],each[2] = each[2],each[0]
                        list2.append(each)
                elif each[0] == each[2]:
                        each[1],each[2] = each[2],each[1]
                        list2.append(each)
                else:
                        list3.append(each)
        list1.sort(reverse = True)
        print('list1',list1)
        list2.sort(reverse = True)
        print('list2',list2)
       
        print('list3',list3)
       
       
       
       
        for each in list3:
                list3_1.append(sum(each))              #收集list3每组的sum和每组zip打包
        #print(list3_1)
       
        list3_2 = list(zip(list3_1,list3))
        list3_2.sort(reverse = True)                                #根据list3的sum从大到小排序
        #print(list3_2)
        for each in list3_2:
                list3_3.append(each[1])
        list_rank = list1 + list2 + list3_3
        return '最终排序',list_rank
       
       
print(Rank(List_sz(20)))

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-3-23 13:40:02 | 显示全部楼层
  1. import numpy as np
  2. li=[(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),
  3.     (1, 5, 2), (5, 6, 6), (1, 4, 6), (2, 1, 6), (1, 3, 3), (6, 6, 5)]

  4. list1=[]
  5. list2=[]
  6. list3=[]

  7. for i in li:
  8.     if i[0]==i[1]==i[2]:
  9.       
  10.         list1.append(i)
  11.         

  12.     if i[0]==i[1]!=i[2]  or i[1]==i[2]!=i[0]:
  13.         
  14.         list2.append(i)
  15.         
  16.     if i[0]==i[2]!=i[1]:
  17.         i[2]=i[1]
  18.         i[1]=i[0]
  19.         list2.append(i)
  20.         
  21.     if i[0]!=i[1]!=i[2]:
  22.         list3.append(i)


  23. for i in range (len(list2)-1):
  24.     for j in range (len(list2)-1):
  25.         if list2[j][1]<list2[j+1][1]:
  26.             a= list2[j+1]
  27.             list2[j+1]=list2[j]
  28.             list2[j]=a

  29. for i in range (len(list3)-1):
  30.     for j in range (len(list3)-1):
  31.         if list3[j][0]+list3[j][1]+list3[j][2] <list3[j+1][0]+list3[j+1][1]+list3[j+1][2]:
  32.             a= list3[j+1]
  33.             list3[j+1]=list3[j]
  34.             list3[j]=a
  35.         
  36. list1.sort(reverse=True)

  37. li=list1+list2+list3
  38. print(li)
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-3-23 14:00:10 | 显示全部楼层
import random as rm
import operator as op
n = eval(input(('请输入掷色子的次数:')))
list1,list2,list3,list4,list5=[],[],[],[],[]
for i in range(1,n+1):
    list1.append((rm.randint(1,6),rm.randint(1,6),rm.randint(1,6)))
for t in list1:
    if t[0]==t[1]==t[2]:
        list2.append(t)
    elif t[0]==t[1] or t[0]==t[2] or t[1]==t[2]:
        list3.append(t)
    else:
        list4.append(t)
list5 = sorted(list2,key=op.itemgetter(0),reverse=True) + sorted(list3, key=lambda t:(sorted(list(t))[1],sum(t)),reverse=True) + sorted(list4, key=lambda t: sum(t), reverse=True)
print(list5)

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-3-23 14:56:16 | 显示全部楼层
  1. arr=[(4, 1, 1), (2, 2, 2), (5, 6, 1), (4, 3, 6), (2, 4, 3), (1, 1, 1),
  2.      (4, 3, 6), (6, 3, 3), (1, 3, 6), (4, 4, 3), (6, 2, 2), (1, 5, 2),
  3.      (5, 6, 6), (1, 4, 6), (2, 1, 6), (1, 3, 3), (6, 6, 5)
  4.     ]   
  5. brr=[]    #记录每个元组的权重  
  6. for dice in arr:               
  7.         sdice=sorted(dice)   #对每轮三个点数排序,便于比较
  8.         if sdice[0]==sdice[2]:   #三个一样大
  9.                 s=sdice[0]*100
  10.         elif sdice[0]==sdice[1]:   #两个一样大a,a,b
  11.                 s=sdice[0]*10+sdice[2]
  12.         elif sdice[1]==sdice[2]:     #两个一样大a,b,b
  13.                 s=sdice[1]*10+sdice[0]
  14.         else:      #都不一样
  15.                 s=sum(dice)
  16.         brr.append(s)
  17. for i in range(0,len(brr)-1):    #权重排序,同步排序源数据
  18.         for j in range(i+1,len(brr)):
  19.                 if brr[j]>brr[i]:
  20.                         brr[j],brr[i]=brr[i],brr[j]
  21.                         arr[j],arr[i]=arr[i],arr[j]
  22. print(arr)
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-3-23 17:47:27 | 显示全部楼层
num  = input('请输入掷骰子的次数:')
num = int(num)
list1 = []
import random
n=0
while n<num:
    i = random.randint(1,6)
    j = random.randint(1,6)
    k = random.randint(1,6)
    tup = (i,j,k)
    list1.append(tup)
    n +=1
print('原掷骰子数据:',list1)

print('--------------------------------------------------------')

#三个一样
listsame = []
#两个一样
listtwosame = []
#都不一样的
listnosame = []

for each in list1:
    if max(each) == min(each):
        listsame.append(each)
    elif( each[0] != each[1] and each[0]!=each[2] and each[1]!= each[2]):
        listnosame.append(each)
    else:
        listtwosame.append(each)

listresult = []

#分别对listsame listtwosame listnosame 进行排序
listsame = sorted(listsame,reverse=True)
#对listnosame 进行排序
for each in listnosame:
    for i in range(len(listnosame)-1):
        for j in range(len(listnosame)-i-1):
            if  listnosame[j][0]+listnosame[j][1]+listnosame[j][2]< listnosame[j+1][0]+listnosame[j+1][1]+listnosame[j+1][2] :
                listnosame[j], listnosame[j+1] = listnosame[j+1], listnosame[j]

#对listtwosame 进行排序
def compare(tup):
    same =0
    nosame =0
    if(tup[0]==tup[1]):
        same = tup[0]
        nosame = tup[2]
    elif(tup[0]==tup[2]):
        same = tup[0]
        nosame = tup[1]
    else:
        same = tup[1]
        nosame = tup[0]
    tup2 = (same,nosame)
    return tup2

for each in listtwosame:
    for i in range(len(listtwosame)-1):    # 这个循环负责设置冒泡排序进行的次数
        for j in range(len(listtwosame)-i-1):  # j为列表下标
            if compare(listtwosame[j])[0] < compare(listtwosame[j+1])[0]:
                listtwosame[j], listtwosame[j+1] = listtwosame[j+1], listtwosame[j]
            elif compare(listtwosame[j])[0] == compare(listtwosame[j+1])[0]:
                if compare(listtwosame[j])[1] < compare(listtwosame[j+1])[1]:
                    listtwosame[j], listtwosame[j + 1] = listtwosame[j + 1], listtwosame[j]
if  listsame:
    listresult.extend(listsame)
if  listtwosame:
    listresult.extend(listtwosame)
if  listnosame:
    listresult.extend(listnosame)
print('排序后数据:',listresult)


请输入掷骰子的次数:12
原掷骰子数据: [(6, 2, 5), (2, 5, 6), (2, 2, 5), (3, 2, 4), (3, 6, 3), (5, 5, 4), (6, 3, 1), (2, 6, 2), (2, 1, 1), (1, 3, 3), (6, 1, 6), (3, 4, 2)]
--------------------------------------------------------
排序后数据: [(6, 1, 6), (5, 5, 4), (3, 6, 3), (1, 3, 3), (2, 6, 2), (2, 2, 5), (2, 1, 1), (6, 2, 5), (2, 5, 6), (6, 3, 1), (3, 2, 4), (3, 4, 2)]

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-3-23 18:01:30 | 显示全部楼层
本帖最后由 graceasyi 于 2018-3-27 15:33 编辑

写得太复杂了,唉,脑细胞严重不够用!

  1. import random
  2. from operator import itemgetter, attrgetter

  3. # 产生一组掷骰子的数据,掷骰子的次数由输入参数n决定
  4. def dice(n):
  5.     return [tuple([random.randint(1, 6) for i in range(3)]) for j in range(n)]


  6. def compare(data):
  7.     dl = [list(tp) for tp in data]
  8.     for s in dl:
  9.         s.sort(reverse=True)

  10.     t1, t2, t3 = [], [], []
  11.     for d in dl:
  12.         if len(d)-len(set(d)) == 2:
  13.             t1.append(d)
  14.         elif len(d)-len(set(d)) == 1:
  15.             t2.append(d)
  16.         else:
  17.             t3.append(d)

  18.     if len(t1) > 1:
  19.         t1.sort(reverse=True)

  20.     if len(t2) > 1:
  21.         t2.sort(key=itemgetter(1, 0, 2), reverse=True)

  22.     if len(t3) > 1:        

  23.         for i in range(len(t3)):
  24.             for j in range(i):
  25.                 if sum(t3[i]) > sum(t3[j]):
  26.                     t3.insert(j, t3.pop(i))
  27.                     break

  28.     return [tuple(tp) for tp in t1+t2+t3]


  29. print(compare(dice(20)))
复制代码

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 06:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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