python - 通过将列表作为键参数传递使用 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() 的默认顺序对其进行排序。
任何帮助表示赞赏,谢谢!
解决方案
我会通过为每张卡片分配数字权重来解决这个任务。像这样的东西:
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"
)映射到数字排名。为此,我使用这些左侧部分的字典映射到相应的数字等级值。
推荐阅读
- java - JMeter 拆解问题
- c++ - 将 Lanczos 算法实现到 C++ 中,用于量子非谐振荡器
- python - 通过在其环境中安装项目从 src 目录中的包导入 python 模块
- php - Laravel 一张表中的多重变形关系
- r - R网页抓取输出“字符(空)”
- ruby-on-rails - 使用 Rails for WordPress 进行 SSO 集成
- python - 动态 ID - 如何在 Python 中单击带有 selenium 的动态按钮
- php - 如何回显文本而不是值
- prolog - 序言:最后一个元素
- python - 如何在 Pandas 字符串列中替换完全匹配的字符串