我正在尝试为要订购的字符串列表开发一个简单的自定义比较。 该列表代表一系列卡片,它的编写方式如下:
['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并与其他char进行比较。
因此,我希望使用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 vers:3.5.2
答案 0 :(得分:1)
这是一个更简单的解决方案:
currency_name
它通过对卡的元组形式进行排序来工作,其中元组的第一个元素是字符串的第一个字符,而元组的第二个元素是第二个元素的整数形式(可能是第三个元素)字符串'10'的字符串。
答案 1 :(得分:1)
如果数字不是10,你可以为数字添加0,然后直接按键进行比较:
hand = sorted(hand, key=lambda x: x if len(x) == 3 else x[0] + '0' + x[1])