Сортировка списка с использованием sorted () путем передачи списка в качестве ключевого аргумента - PullRequest
2 голосов
/ 02 апреля 2020

У меня есть список, который содержит все карты из стандартной колоды из 52 карт. Теперь мне интересно, как я могу отсортировать эти карты по их стоимости, от тузов до королей. Моя идея состояла в том, чтобы использовать sorted (), но я не могу понять, как мне передать порядок списка blueprint_deck в качестве ключа для функции.

Мой сценарий:

import random

Clubs = ["Clubs"]
Diamonds = ["Diamonds"]
Hearts = ["Hearts"]
Spades = ["Spades"]

blueprint_deck = [ "Ace", "2", "3", "4", "5", "6", "7",
                   "8", "9", "10", "Jack", "Queen", "King"]

deck = [i + " of " + j for i in blueprint_deck for j in Clubs + Diamonds + Hearts + Spades]

print(deck)

Это уже вернет отсортированную колоду, но я хочу знать, как я мог бы достичь этого порядка с помощью функции после рандомизации списка, например:

random_list = random.sample(deck, len(deck))
print(random_list)

Какую функцию мне нужно передать на ключевой аргумент sorted () для достижения моей цели? Я пробовал что-то вроде этого:

def keyf(blueprint_deck):
    return blueprint_deck

print(sorted(random_list, key=keyf))

Но это, кажется, просто сортирует его в порядке сортировки по умолчанию ().

Любая помощь приветствуется, спасибо!

Ответы [ 3 ]

1 голос
/ 02 апреля 2020

Вы хотите отсортировать по положению значения в списке; deck.index. Вот пример:

suits = ["Clubs", "Diamonds", "Hearts", "Spades"]

blueprint_deck = ["Ace", "2", "3", "4", "5", "6", "7",
                  "8", "9", "10", "Jack", "Queen", "King"]

deck = [i + " of " + j for i in blueprint_deck for j in suits]

test = ["8 of Spades", "9 of Spades", "Ace of Diamonds", "King of Hearts"]

print(test)
print(sorted(test, key = deck.index))

Вывод:

['8 of Spades', '9 of Spades', 'Ace of Diamonds', 'King of Hearts']
['Ace of Diamonds', '8 of Spades', '9 of Spades', 'King of Hearts']
1 голос
/ 02 апреля 2020

Я бы решил эту задачу, назначив числовые веса для каждой карты. Примерно так:

weight = {"Ace": 1, "2": 2, "3": 3, "4": 4,
          "5": 5, "6": 6, "7": 7, "8": 8, 
          "9": 9, "10": 10, "Jack": 11,
          "Queen": 12, "King": 14}

def keyf(card):
    return weight[card.split()[0]]

print(sorted(random_list, key=keyf))

Функция, указанная в параметре key, вызывается для каждого элемента в списке. Идея состоит в том, чтобы присвоить какой-либо ранг каждому элементу. Однако, поскольку элементы представлены в виде простого текста, нам нужно сначала проанализировать его, взяв только самую левую часть.

UPD: Некоторое дополнительное объяснение идеи.

Представьте себе, у вас есть список пар. Природа списка на самом деле не имеет значения, поэтому пусть он состоит из пар, подобных этой [('jack', 11), ('ace', 1), ('queen', 12)]. Если вы хотите отсортировать список, используя только второй элемент из каждой пары (я называю это рангом ), вам нужно научить sorted() функцию рассматривать только на втором элементе (то есть ) rank ) при сортировке списка:

lst = [('jack', 11), ('ace', 1), ('queen', 12)]
lst = sorted(lst, key=lambda c: c[1])

Это обычная техника, по крайней мере, в мире Python.

Теперь, возвращаясь к исходному заданию, вы не сможете действительно нет списка пар. Скорее у вас есть список строк следующего формата "Ace of Clubs", "2 of Diamonds", et c. Итак, во-первых, вам нужно преобразовать каждый элемент в пару, разбив строку на пустое пространство. Затем, поскольку вас интересует ранг, вам необходимо отобразить левую часть (например, "Ace" или "2") на ранг цифр c. Для этого я использую точное наложение таких левых частей на соответствующее число c значение ранга.

0 голосов
/ 02 апреля 2020

Проверьте мое решение

orderTable = {"Ace": 0, "Jack": 10, "Queen": 11, "King": 12, "Clubs": 0, "Diamonds": 1,
  "Hearts": 2, "Spades": 3}

def cardOrder(card):
  (f,x,s) = card.split()
  n = orderTable[f] if f in orderTable else int(f) - 1
  return n * 4 + orderTable[s]

def sort_deck(deck_list):
  sorted_list = list(range(13 * 4))
  for card in deck_list: 
    sorted_list[cardOrder(card)] = card;
  return sorted_list

Тест

print(deck, end="\n---Shuffled deck---\n")
print(random_list, end="\n---Ordered once again---\n")
print(sort_deck(random_list))

Вывод

['Ace of Clubs', 'Ace of Diamonds', 'Ace of Hearts', 'Ace of Spades', '2 of Clubs',
 '2 of Diamonds', '2 of Hearts', '2 of Spades', '3 of Clubs', '3 of Diamonds',
 '3 of Hearts', '3 of Spades', '4 of Clubs', '4 of Diamonds', '4 of Hearts',
 '4 of Spades', '5 of Clubs', '5 of Diamonds', '5 of Hearts', '5 of Spades',
 '6 of Clubs', '6 of Diamonds', '6 of Hearts', '6 of Spades', '7 of Clubs',
 '7 of Diamonds', '7 of Hearts', '7 of Spades', '8 of Clubs', '8 of Diamonds',
 '8 of Hearts', '8 of Spades', '9 of Clubs', '9 of Diamonds', '9 of Hearts',
 '9 of Spades', '10 of Clubs', '10 of Diamonds', '10 of Hearts', '10 of Spades',
 'Jack of Clubs', 'Jack of Diamonds', 'Jack of Hearts', 'Jack of Spades',
 'Queen of Clubs', 'Queen of Diamonds', 'Queen of Hearts', 'Queen of Spades',
 'King of Clubs', 'King of Diamonds', 'King of Hearts', 'King of Spades']
---Shuffled deck---
['9 of Spades', '5 of Hearts', 'King of Clubs', '9 of Diamonds', '6 of Diamonds',
 'Ace of Spades', '5 of Diamonds', '3 of Clubs', '5 of Spades', '7 of Hearts',
 'Queen of Spades', '4 of Hearts', 'Jack of Spades', '7 of Spades', '4 of Spades',
 'King of Hearts', 'King of Spades', 'Jack of Clubs', '4 of Clubs', '3 of Hearts',
 '2 of Clubs', '2 of Hearts', 'Queen of Hearts', 'Ace of Diamonds', 'Jack of Hearts',
 '10 of Clubs', '8 of Diamonds', '7 of Diamonds', '10 of Hearts', '10 of Diamonds',
 'King of Diamonds', '5 of Clubs', 'Ace of Hearts', 'Ace of Clubs', '4 of Diamonds',
 '3 of Spades', 'Queen of Diamonds', '2 of Spades', '6 of Spades', '9 of Clubs',
 '8 of Clubs', 'Jack of Diamonds', '3 of Diamonds', '10 of Spades', '2 of Diamonds',
 '7 of Clubs', '6 of Clubs', '8 of Spades', 'Queen of Clubs', '9 of Hearts',
 '6 of Hearts', '8 of Hearts']
---Ordered once again---
['Ace of Clubs', 'Ace of Diamonds', 'Ace of Hearts', 'Ace of Spades', '2 of Clubs',
 '2 of Diamonds', '2 of Hearts', '2 of Spades', '3 of Clubs', '3 of Diamonds',
 '3 of Hearts', '3 of Spades', '4 of Clubs', '4 of Diamonds', '4 of Hearts',
 '4 of Spades', '5 of Clubs', '5 of Diamonds', '5 of Hearts', '5 of Spades',
 '6 of Clubs', '6 of Diamonds', '6 of Hearts', '6 of Spades', '7 of Clubs',
 '7 of Diamonds', '7 of Hearts', '7 of Spades', '8 of Clubs', '8 of Diamonds',
 '8 of Hearts', '8 of Spades', '9 of Clubs', '9 of Diamonds', '9 of Hearts',
 '9 of Spades', '10 of Clubs', '10 of Diamonds', '10 of Hearts', '10 of Spades',
 'Jack of Clubs', 'Jack of Diamonds', 'Jack of Hearts', 'Jack of Spades',
 'Queen of Clubs', 'Queen of Diamonds', 'Queen of Hearts', 'Queen of Spades',
 'King of Clubs', 'King of Diamonds', 'King of Hearts', 'King of Spades']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...