Python3.5 Sorted Custom Compare не работает ожидаемым - PullRequest
0 голосов
/ 30 апреля 2018

Я пытаюсь разработать простое пользовательское сравнение для списка строк на заказ. Список представляет собой массив карточек, и он написан так:

['d10', 's2', 'c3', 'b5', 'c7', 'b2', 'b10', 'b7', 'c6', 's6']

Каждая строка представлена ​​символом ('b','c','d','s'), числовые значения варьируются от 1 до 10 (FE попросил меня об этом, для меня было бы идеально, если бы значения были от 0 до 9).

Проблема: если я вызываю функцию sort() в списке, она работает нормально, за исключением значений со значением 10. Я думаю, что он рассматривает 10 как строку и сравнивает первый символ, который равен 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

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Вы можете добавить 0 к числу, если это не 10, а затем сравнить по ключам напрямую:

hand = sorted(hand, key=lambda x: x if len(x) == 3 else x[0] + '0' + x[1])
0 голосов
/ 30 апреля 2018

Вот гораздо более простое решение:

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

Он работает путем сортировки по форме кортежа карты, при этом первый элемент кортежа является первым символом вашей строки, а второй элемент кортежа является целочисленной формой вашей второй (и, возможно, 3-й в регистр '10') символов вашей строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...