首页 > 解决方案 > 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

标签: pythonpython-3.xlistsorting

解决方案


这是一个更简单的解决方案:

cards.sort(key=lambda x: (x[0], int(x[1:])))
>>> ['b2', 'b5', 'b7', 'b10', 'c3', 'c6', 'c7', 'd10', 's2', 's6']

它通过对卡片的元组形式进行排序来工作,其中元组的第一个元素是字符串的第一个字符,元组的第二个元素是第二个的整数形式(在 ' 的情况下可能是第三个) 10') 字符串的字符。


推荐阅读