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

Python 通过将列表作为关键参数传递,使用sorted()对列表进行排序,python,list,sorting,key,Python,List,Sorting,Key,我有一个列表,其中包含标准52张牌组中的所有牌。我现在想知道如何根据这些卡片的价值对它们进行排序,从A到K。我的想法是使用sorted(),但我无法理解如何将列表组的顺序作为函数的键传递 我的剧本: import random Clubs = ["Clubs"] Diamonds = ["Diamonds"] Hearts = ["Hearts"] Spades = ["Spades"] blueprint_deck = [ "Ace", "2", "3", "4", "5", "6", "

我有一个列表,其中包含标准52张牌组中的所有牌。我现在想知道如何根据这些卡片的价值对它们进行排序,从A到K。我的想法是使用sorted(),但我无法理解如何将列表组的顺序作为函数的键传递

我的剧本:

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)]
。如果您想通过只使用每一对中的第二个元素来排序列表(我称之为秩),则需要教<代码>排序()/<代码>函数,在排序列表时只考虑第二个元素(即秩):

lst = [('jack', 11), ('ace', 1), ('queen', 12)]
lst = sorted(lst, key=lambda c: c[1])
这是一种常见的技术,至少在Python世界是如此


现在,回到最初的任务,您实际上没有一个成对的列表。相反,您有以下格式的字符串列表:
“梅花王牌”
“钻石之二”
,等等。因此,首先,您需要通过在空白处拆分字符串,将每个元素转换为一对。然后,由于您对排名感兴趣,因此需要将左侧部分(例如,
“Ace”
“2”
)映射到数字排名。为此,我使用这些左部分的dict映射到相应的数字秩值。

您希望根据值在列表中的位置进行排序<代码>甲板索引。下面是一个例子:

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']
检查我的解决方案

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
试验

输出

['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']

keyf
返回其参数不变。这是排序的
键的默认行为。你必须计算卡片的价值,而不是仅仅返回卡片。这非常有效,非常感谢!您能否详细说明一下为什么weight[card.split()[0]]符合我们的要求?我在绞尽脑汁,但我不明白。回答得好,谢谢。是否有一种使用blueprint_deck索引的方法?根据我的理解,你的解决方案只有在我们已经有了像我的脚本中那样的预分类甲板的情况下才会起作用,但我认为如果我们只有一个随机甲板的情况下是不起作用的;首先按suits.index排序,然后按blueprint\u deck.index排序。这将产生同样的效果。但是,请注意,例如“红心之王”不在诉讼清单中。因此,在传递到suits.index之前,您应该仅从卡中提取西装。例如,key=lambda x:suits.index(x.split(“of”)[1])。同样适用于蓝图列表步骤。
['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']