python - 通过传递列表作为键参数,使用sorted() 对列表进行排序

标签 python list sorting key

我有一个列表,其中包含标准 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/

相关文章:

python - 如何从 Mongoengine/Pymongo 中的字典中自动删除键?

python - Tensorboard 分析器 : Failed to load libcupti (is it installed and accessible? )

python - TypeError : The value of a feed cannot be a tf. Tensor对象传递一个热编码时

python - 如何获取非整数元素的索引

java - 如何实现不断增长的列表

c - 数组检查从 0 到 size-1 的所有整数

sorting - Elixir 如何对列表理解进行排序?

python - "if"语句查找剩余数字并附加到 csv 列表中

python - 如何从 Pandas DataFrame 的列内列表中删除值

javascript - 从多个选项中获取所有变化