鱼C论坛

 找回密码
 立即注册
查看: 1939|回复: 4

[已解决]Python列表自定义排序问题求助

[复制链接]
发表于 2021-7-16 16:34:49 | 显示全部楼层 |阅读模式

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

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

x
题目:扑克牌有四种花色:黑红梅方。扑克牌按点数从小到大是2,3,4,……,J,Q,K,A。编程序实现下列目标:
(1)按花色排序输出(小到大)
(2)按花色排序后,将同色牌按点数排序输出(大到小)
(3)第2步完成后,去除相同花色中数字重复的牌
下面是我的代码,感觉没什么问题,可就是运行之后毫无效果
import  functools
Cards = ['梅花A','方块4','梅花2','方块4','红桃7','黑桃Q','红桃K','梅花9','方块9','红桃5','梅花J','方块8','红桃5','黑桃3','黑桃10','黑桃3','红桃7','黑桃Q']
def custom_cmp1(x, y):
    arr = ['黑桃','红桃','梅花','方块']
    if arr.index(x[0:1]) < arr.index(y[0:1]):
        return 1
    else:
        return -1
def StyleSort(*args):
    new = list(args)
    newlist = sorted(new,key=functools.cmp_to_key(custom_cmp1))
    return newlist
def custom_cmp2(x, y):
    arr = ['J','Q','K','A']
    if x[0:1] == y[0:1]:
        if arr.index(x[2]) < arr.index(y[2]):
            return 1
        else: return -1
def PointSort(*args):
    newlist = sorted(args,key=functools.cmp_to_key(custom_cmp2))
    return newlist
def DelRepeat(*args):
    for i in range(len(args)):
        for j in range(i+1,len(args)):
            if args[i] == args[j]:
                args[j] = 'del'
    tmplist = [e for e in args if e != 'del']
    newlist = list(tmplist)
    return newlist
最佳答案
2021-7-16 20:33:57

自己写了下,看看行不行达到需求:
from itertools import groupby

Cards = ['梅花A','方块4','梅花2','方块4','红桃7','黑桃Q','红桃K','梅花9','方块9','红桃5','梅花J','方块8','红桃5','黑桃3','黑桃10','黑桃3','红桃7','黑桃Q']
arr = ['黑桃','红桃','梅花','方块']
num = {'J':11, 'Q':12, 'K':13, 'A':14}

Cards.sort(key=lambda x:arr.index(x[:2]))
New_Cards = groupby(Cards,lambda x:x[:2])
New_Cards = [list(set(j)) for i,j in New_Cards]

result = []
for i in range(len(New_Cards)):
    New_Cards[i].sort(key=lambda x: int(x[2:]) if x[2:].isdigit() else num[x[2]])
    [result.append(j) for j in New_Cards[i]]

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

使用道具 举报

发表于 2021-7-16 20:33:57 | 显示全部楼层    本楼为最佳答案   

自己写了下,看看行不行达到需求:
from itertools import groupby

Cards = ['梅花A','方块4','梅花2','方块4','红桃7','黑桃Q','红桃K','梅花9','方块9','红桃5','梅花J','方块8','红桃5','黑桃3','黑桃10','黑桃3','红桃7','黑桃Q']
arr = ['黑桃','红桃','梅花','方块']
num = {'J':11, 'Q':12, 'K':13, 'A':14}

Cards.sort(key=lambda x:arr.index(x[:2]))
New_Cards = groupby(Cards,lambda x:x[:2])
New_Cards = [list(set(j)) for i,j in New_Cards]

result = []
for i in range(len(New_Cards)):
    New_Cards[i].sort(key=lambda x: int(x[2:]) if x[2:].isdigit() else num[x[2]])
    [result.append(j) for j in New_Cards[i]]

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

使用道具 举报

 楼主| 发表于 2021-7-17 13:19:36 | 显示全部楼层
Twilight6 发表于 2021-7-16 20:33
自己写了下,看看行不行达到需求:

啊这,非常好,可是我看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-17 13:49:30 | 显示全部楼层
Dogelike 发表于 2021-7-17 13:19
啊这,非常好,可是我看不懂


代码中 [  ] 中括号中 for 循环就是列表推导式,第 13 行 lambad 匿名函数后面用的是 if -else 三目运算符

groupby 是分组函数,将同花色分组

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

使用道具 举报

发表于 2021-7-17 15:31:55 | 显示全部楼层
Cards = ['梅花A','方块4','梅花2','方块4','红桃7','黑桃Q','红桃K','梅花9','方块9','红桃5','梅花J','方块8','红桃5','黑桃3','黑桃10','黑桃3','红桃7','黑桃Q']
arr = ['黑桃','红桃','梅花','方块']
num = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']
all_cards = [c + n for c in arr for n in num]
res = sorted(set(Cards), key=all_cards.index)
print(res)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-14 00:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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