首页 > 解决方案 > 通过将列表作为键参数传递使用 sorted() 对列表进行排序

问题描述

我有一个列表,其中包含标准 52 张卡片组中的所有卡片。我现在想知道如何按照它们的值对这些牌进行排序,从 A 到 K。我的想法是使用 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))

但这似乎只是按照 sorted() 的默认顺序对其进行排序。

任何帮助表示赞赏,谢谢!

标签: pythonlistsortingkey

解决方案


我会通过为每张卡片分配数字权重来解决这个任务。像这样的东西:

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为列表中的每个元素调用通过 param 指定的函数。这个想法是为每个元素分配某种等级。然而,由于元素表示为纯文本,我们需要首先解析它,只取最左边的部分。

UPD:对这个想法的一些额外解释。

想象一下,你有一个配对列表。列表的性质并不重要,所以让它由这样的对组成[('jack', 11), ('ace', 1), ('queen', 12)]。如果您只想使用每对中的第二个元素(我称之为rank)对列表进行排序,则需要在对列表进行排序时教sorted()函数仅考虑第二个元素(即rank):

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

这是一种常见的技术,至少在 Python 世界中是这样。

现在,回到最初的任务,你并没有真正的配对列表。相反,您有一个以下格式的字符串列表"Ace of Clubs","2 of Diamonds"等。因此,首先,您需要通过在空格上拆分字符串来将每个元素转换为一对。然后,由于您对排名感兴趣,您需要将左侧部分(例如"Ace""2")映射到数字排名。为此,我使用这些左侧部分的字典映射到相应的数字等级值。


推荐阅读