【问题标题】:Sort Python list by dict key,value按 dict 键、值对 Python 列表进行排序
【发布时间】:2014-02-12 18:42:12
【问题描述】:

我有一个卡片等级和值的字典,我想对包含 4 张卡片的列表进行排序,以便根据等级和值对卡片进行适当排序。

RANKS = ["A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"]
VALUES = [1, 2, 3, 4, 5, 6, 7, 8, 9 , 10, 10, 10, 10]
val_dict = dict(zip(RANKS, VALUES))


list = ["2","2","3","A"] # should sort to ["A",2,2,3]
list2 = ["10","K","J","Q"] # sort to [10,"J","Q","K"]

背景: 我想以这种方式对这些列表进行排序,以便计算纸币手中的跑步次数。我使用卡片的序数值来确定它们是否是连续的。 (我也可以提供该代码,如果它可能有助于重新这样做)

【问题讨论】:

  • 应该list(顺便说一句不是一个好的命名选择)是["2", "2", "3", "A"]
  • 只是示例代码,不在生产环境中。是的,它们是字符串。会更新。
  • 你为什么在同一个列表中混合排名和值
  • 而不是价值和排名,在我看来,排名就足够了。但是,您会发现您的列表应该只包含一种类型的对象才能进行简单排序。

标签: python sorting python-3.x dictionary


【解决方案1】:

假设您的列表是一致的(即['2', '2', '3', 'A'])并且由RANKS 的元素组成,那么按RANKS 中的位置排序就足够了:

>>> sorted(['2', '2', '3', 'A'], key=lambda x: RANKS.index(x))
['A', '2', '2', '3']
>>> sorted(['10',"K","J","Q"], key=lambda x: RANKS.index(x))
['10', 'J', 'Q', 'K']

编辑

或者,您可以使用

val_dict = dict(zip(RANKS, zip(VALUES, range(len(VALUES)))))

创建一个将 RANK 名称与其值和索引相关联的字典。然后,您可以简单地使用排序

sorted(myList, key=val_dict.get)

建议多次。

编辑(再次)

按照同样的想法,但更简单,一张牌的实际排名可以放在这样的字典中

{k: v for v, k in enumerate(RANKS)}

为了更快的查找。同样,该值可以放在另一个字典中以进行快速查找:

{RANKS[v]: k for v, k in enumerate(VALUES)}

【讨论】:

  • 唯一的缺点是排序效率低。
  • 我错过了 OP 想要对大小为 4 的列表进行排序的部分。:/
  • 到目前为止,这对我所有的测试都有效。令人惊讶的简单答案,谢谢:)
【解决方案2】:

你已经明白了,你只需要使用你定义的val_dict

RANKS = ["A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"]
VALUES = [1, 2, 3, 4, 5, 6, 7, 8, 9 , 10, 10, 10, 10]
val_dict = dict(zip(RANKS, VALUES))

现在只需在您的代码上方添加一些使用val_dict 来查找值排名的内容...例如:

mylist = ["2","2","3","A"] # should sort to ["A",2,2,3]
mylist_sorted = sorted(mylist, key=val_dict.get)
# ['A', '2', '2', '3']

正如@Ashwini 正确指出的那样,根据您的第二个示例,这不会产生所需的顺序。为了保持逻辑简单,一个相当简单的方法是更改​​值:

VALUES = [[1], [2], [3], [4], [5], [6], [7], [8], [9] , [10, 1], [10, 2], [10, 3], [10, 4]]

【讨论】:

  • 对于这么简单的任务来说,这似乎非常复杂。
【解决方案3】:
>>> VALUES = range(len(RANKS))
>>> val_dict = dict(zip(RANKS, VALUES))
>>> sorted([2,2,3,"A"], key=lambda x:val_dict[str(x)])
['A', 2, 2, 3]
>>> sorted([10,"K","J","Q"], key=lambda x:val_dict[str(x)])
[10, 'J', 'Q', 'K']

【讨论】:

  • VALUES 也用于评分,所以 K = 10、Q = 10 等。不过,我想我可以利用你的答案,所以谢谢你的想法。
  • @erbaker Python 的排序是稳定排序,对于具有相同价值的项目,它们在列表中的原始顺序将被保留。因此,您需要使用不同的值。
  • 这对于简单地将排名索引与排名名称相关联是完全过分的。到底。 val_dict[a] == RANKS.index(a)
  • 字典提供O(1) 查找,list.indexO(N)。但是对于庞大的列表,这将很好地扩展。
猜你喜欢
  • 1970-01-01
  • 2011-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-14
  • 1970-01-01
相关资源
最近更新 更多