Сортировка списка объектов по attibute не сортирует? - PullRequest
0 голосов
/ 26 августа 2018

Я хочу запрограммировать покер-симулятор холдема на python для изучения языка (python 3.7). Я начал с создания карточного класса, который содержит ценность (например, 5 или K) и костюм (например, червы или пики). Колода карт создается путем сопоставления каждого значения с каждой мастью:

suits = ["Hearts","Diamonds","Spades","Clubs"]
values = ["2","3","4","5","6","7","8","9","10","11","12","13","14"] 
#note that i replaced the values J by 10, Q by 11...to later easier compare them
class Card(object):   
    value = 0
    suit = ""

    def __init__(self, value, suit):
        self.value = value
        self.suit = suit

def create_card(value, suit):  
    card = Card(value, suit)
    return card

deck = []
for i in values: 
    for j in suits:
        deck.append(create_card(i,j))

random.shuffle(deck)

так что теперь у меня есть перетасованный список объектов-карт, я беру две карты и назначаю их игроку. Затем я беру еще 5 карт, общие карты:

player1 = []
for i in range(2):
   player1.append(deck.pop(0))

commoncards = []
for i in range(5):
   commoncards.append(deck.pop(0))

Теперь у меня есть два списка карт-объектов, один для целых карт моих игроков и один для общих карт. Все идет нормально. Теперь я хочу определить комбинацию игроков (например, пару, две пары или три вида и т. Д.), И я подумал, что хорошим способом было бы присоединиться к списку игроков и копии списка общих карт и отсортировать их по значению, чтобы проверить, если два соседних элемента имеют одинаковое значение:

commoncardscopy=commoncards.copy()   
player1.extend(commoncardscopy)

player1.sort(key=lambda Card : Card.value)

for i in range(len(player1)):
    print(player1[i].value)

Это должно напечатать 7 отсортированных значений карт (например, 2,2,4,5,8,8,12), верно? Ну, это не так. Вот пример вывода: 10 13 13 14 7 7 9 * +1010 *

Кто-нибудь знает почему? Любая помощь или отзывы приветствуются:)

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

Возможно, было бы неплохо использовать целые числа для значений карт, поскольку при использовании строк карты сортируются в алфавитном порядке. Возможно, вы захотите использовать функцию int() для конвертации, если вы хотите сохранить строки значений вашей карты. У вас есть несколько вариантов:

  • заменить values списком целых чисел
  • заменить код в лямбде и использовать key = lambda x: int(x.value)
0 голосов
/ 26 августа 2018

Попробуйте использовать:

...
print(sorted([int(i.value) for i in player1]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...