Сортировка списков со смешанным int и строками - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь написать какую-нибудь игру на томбале. Вот мой код.

self.player1_cards = [
        [random.randint(1, 91), '', random.randint(1, 91), '', random.randint(1, 91), '',
            random.randint(1, 91), '', random.randint(1, 91), random.randint(1, 91), ''],
        [random.randint(1, 91), random.randint(1, 91), '', random.randint(1, 91), '',
            random.randint(1, 91), '', random.randint(1, 91), random.randint(1, 91)],
        [random.randint(1, 91), '', random.randint(1, 91), '', random.randint(1, 91),
            '', random.randint(1, 91), '', random.randint(1, 91)]
    ]
    self.player2_cards = [
        [random.randint(1, 91), '', random.randint(1, 91), '', random.randint(1, 91), '',
            random.randint(1, 91), '', random.randint(1, 91), random.randint(1, 91), ''],
        [random.randint(1, 91), random.randint(1, 91), '', random.randint(1, 91), '',
            random.randint(1, 91), '', random.randint(1, 91), random.randint(1, 91)],
        [random.randint(1, 91), '', random.randint(1, 91), '', random.randint(1, 91),
            '', random.randint(1, 91), '', random.randint(1, 91)]
    ]

Я создаю карточки пользователей, как это. После этого я пытаюсь отсортировать все целые числа в порядке возрастания. Однако, когда я попробовал это:

for i in range(0, 3):
        self.player1_cards[i].sort()
        self.player2_cards[i].sort()

    print("Player1:\n", self.player1_cards,
          "\nPlayer 2:\n", self.player2_cards)

Я получаю ошибку, подобную этой:

self.player1_cards[i].sort()
TypeError: '<' not supported between instances of 'str' and 'int'

Я понимаю, почему это происходит, но я не могу понять, как отсортировать этот список. Не могли бы вы мне помочь?

Ответы [ 3 ]

2 голосов
/ 10 марта 2020

Создание примера строки с вашим кодом для первой строки:

>>> import random
>>> row = [random.randint(1, 91), '', random.randint(1, 91), '', random.randint(1, 91), '',
            random.randint(1, 91), '', random.randint(1, 91), random.randint(1, 91), '']
>>> row
[79, '', 78, '', 57, '', 54, '', 84, 26, '']

Извлечение и сортировка чисел, затем их использование в местах для чисел:

>>> ordered = iter(sorted(x for x in row if x != ''))
>>> [next(ordered) if x != '' else '' for x in row]
[26, '', 54, '', 57, '', 78, '', 79, 84, '']

Но вместо этого чтобы построить его несортированным, разобрать и восстановить его отсортированным, было бы проще просто построить его отсортированным.

0 голосов
/ 11 марта 2020

Благодаря переполнению кучи я нахожу решение.

self.player1_cards = [
        [random.randint(1, 91), '', random.randint(1, 91), '', random.randint(1, 91), '',
            random.randint(1, 91), '', random.randint(1, 91), random.randint(1, 91), ''],
        [random.randint(1, 91), random.randint(1, 91), '', random.randint(1, 91), '',
            random.randint(1, 91), '', random.randint(1, 91), random.randint(1, 91)],
        [random.randint(1, 91), '', random.randint(1, 91), '', random.randint(1, 91),
         '', random.randint(1, 91), '', random.randint(1, 91)]
    ]
    self.player2_cards = [
        [random.randint(1, 91), '', random.randint(1, 91), '', random.randint(1, 91), '',
            random.randint(1, 91), '', random.randint(1, 91), random.randint(1, 91), ''],
        [random.randint(1, 91), random.randint(1, 91), '', random.randint(1, 91), '',
            random.randint(1, 91), '', random.randint(1, 91), random.randint(1, 91)],
        [random.randint(1, 91), '', random.randint(1, 91), '', random.randint(1, 91),
            '', random.randint(1, 91), '', random.randint(1, 91)]
    ]

Я создал такую ​​карту. После этого:

    for i in range(0, 3):
        ordered = iter(sorted(x for x in self.player1_cards[i] if x != ''))
        self.player1_cards[i] = [
            next(ordered) if x != '' else '' for x in self.player1_cards[i]]

    for j in range(0, 3):
        ordered1 = iter(
            sorted(x for x in self.player2_cards[j] if x != ''))
        self.player2_cards[j] = [
            next(ordered1) if x != '' else '' for x in self.player2_cards[j]]

С этими l oop я получаю то, что хочу. Это результат:

Player1:
[[3, '', 4, '', 40, '', 50, '', 62, 75, ''], [4, 17, '', 33, '', 36, '', 38, 72], [17, '', 51, '', 56, '', 63, '', 64]]
Player 2:
 [[14, '', 32, '', 39, '', 77, '', 86, 87, ''], [17, 49, '', 61, '', 62, '', 71, 89], [12, '', 13, '', 50, '', 74, '', 80]]
0 голосов
/ 10 марта 2020

Если это соответствует вашему варианту использования, вы можете сортировать числа при создании карточек, тогда их не нужно будет сортировать позже. Используйте внешнюю для класса функцию для создания карточек. Сначала создайте числа; сортировать их; затем добавьте хранителей.

def cards():
    nrows, ncols = 3,6
    a = []
    for _ in range(nrows):
        numbers = [random.randint(1, 91) for _ in range(ncols)]
        numbers.sort()
        numbers = iter(numbers)
        indices = {1,3,5,7,10}
        row = [next(numbers) if i not in indices else '' for i in range(11)]

        a.append(row)
    return a


class F:
    def __init__(self):
        pass
    def other(self):
        self.player1_cards = cards()
        self.player2_cards = cards()

f = F()
f.other()

Если вы не можете изменить способ изготовления карточек - напишите функцию, которая уберет хранителей; сортировать числа; положить хранителей обратно.

def sort_cards(cards):
    new_cards = []
    indices = {1,3,5,7,10}
    for row in cards:
        row = [n for n in row if n != '']
        row.sort()
        row = iter(row)
        new_row = [next(row) if i not in indices else '' for i in range(11)]
        new_cards.append(new_row)
    return new_cards
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...