python - Python3.5 排序自定义比较无法按预期工作
问题描述
我正在尝试为要订购的字符串列表开发一个简单的自定义比较。该列表代表一个卡片数组,它的写法如下:
['d10', 's2', 'c3', 'b5', 'c7', 'b2', 'b10', 'b7', 'c6', 's6']
每个字符串都用 char 表示('b','c','d','s')
,数值从 1 到 10 (FE 要求我这样做,对我来说,如果值从 0 到 9 那就完美了)。
问题:如果我调用sort()
列表中的函数,除了值为 10 的值外,它工作正常。我认为它将 10 视为一个字符串,并将第一个 char 为 1 并与其他字符进行比较。
因此,我希望通过库进行自sorted
定义cmp_to_key
排序functools
。
这是我写的:
def distribute_hands(self):
self.shuffle()
hands = list(self.cards[p:p+SUIT_CARDS] for p in range(0, NUM_CARDS, SUIT_CARDS))
for hand in hands:
hand = sorted(hand, key=cmp_to_key(self.custom_cmp))
return hands
def custom_cmp(self, a, b):
try:
if (a[0] < b[0] or int(a[1]) < int(b[1]+b[2]) ):
return 1
return 0
except IndexError:
if (a[0] < b[0] or int(a[1]) < int(b[1]) ):
return 1
return 0
写得不好,因为我正在努力寻找最佳解决方案。排序根本不起作用,我不明白为什么。
Python版本:3.5.2
解决方案
这是一个更简单的解决方案:
cards.sort(key=lambda x: (x[0], int(x[1:])))
>>> ['b2', 'b5', 'b7', 'b10', 'c3', 'c6', 'c7', 'd10', 's2', 's6']
它通过对卡片的元组形式进行排序来工作,其中元组的第一个元素是字符串的第一个字符,元组的第二个元素是第二个的整数形式(在 ' 的情况下可能是第三个) 10') 字符串的字符。
推荐阅读
- java - Elasticsearch - 基于不区分大小写的方式获取匹配的单词
- ruby-on-rails - 回形针将图像复制到另一个没有原始文件的模型
- windows - windows redis 不工作
- token - 使用 Identity Server 和 SaasKit 发布 securig MultiTenant 应用程序
- ios - 如何通过ios swift(4)中的url链接从放置在服务器中的文件中读取数据?
- c# - .NET CORE 时间异步方法
- ios - 我的应用程序 IOS 无法连接到网络服务“CFNetwork SSLHandshake failed”
- c++ - boost::program_options bool_switch 多次使用
- pepper - Pepper 机器人:如何使用平板电脑发送文本输入以在 Choregraphe 中进行进一步处理?
- git - 无法在 Jgit 中添加文件和提交