我有一个列表,其中包含标准 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
参数指定的函数。这个想法是为每个元素分配某种等级。然而,由于元素表示为纯文本,我们需要首先解析它,只取最左边的部分。
UPD:对这个想法的一些额外解释。
想象一下,您有一个配对列表。列表的性质并不重要,所以让它由像这样的对组成 [('jack', 11), ('ace', 1), ('queen', 12)]
。如果您想仅使用每对中的第二个元素(我称之为排名)对列表进行排序,则需要教导 sorted()
函数仅考虑对列表进行排序时的第二个元素(即排名):
lst = [('jack', 11), ('ace', 1), ('queen', 12)]
lst = sorted(lst, key=lambda c: c[1])
这是一种常见技术,至少在 Python 世界中是这样。
现在,回到最初的任务,您实际上并没有一个配对列表。相反,您有以下格式的字符串列表 "Ace of Clubs"
、"2 of Diamonds"
等。因此,首先,您需要将每个元素转换为通过在空格上分割字符串来生成一对。然后,由于您对排名感兴趣,因此需要将左侧部分(例如 "Ace"
或 "2"
)映射到数字排名。为此,我使用此类左侧部分到相应数字排名值的字典映射。
关于python - 通过传递列表作为键参数,使用sorted() 对列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60995318/