【问题标题】:Using list of dictionary使用字典列表
【发布时间】:2018-01-22 13:20:47
【问题描述】:

我有这样的字典数据

student_data = [{'id':1, 'Hacker' : 'DOSHI', 'Rank' : 43},
 {'id':2, 'Hacker' : 'JOSHI', 'Rank' : 45},
 {'id':3, 'Hacker' : 'MOSHI', 'Rank' : 41},
 {'id':4, 'Hacker' : 'LOSHI', 'Rank' : 98},
 {'id':5, 'Hacker' : 'AOSHI', 'Rank' : 14}]

当我使用 sorted 对字典列表进行排序时,我的代码是

print sorted(student_data), 

输出是:

[{'Hacker': 'AOSHI', 'id': 5, 'Rank': 14},
 {'Hacker': 'DOSHI', 'id': 1, 'Rank': 43},
 {'Hacker': 'JOSHI', 'id': 2, 'Rank': 45},
 {'Hacker': 'LOSHI', 'id': 4, 'Rank': 98},
 {'Hacker': 'MOSHI', 'id': 3, 'Rank': 41}]

根据键“Hacker”排序的字典列表,我想根据“Rank”对数据进行排序。
谁能解释为什么字典列表使用键“Hacker”进行排序?其他键是“id”和“Rank”,但根据“Hacker”进行排序,该键不是第一个键,而是选择对元素进行排序。

【问题讨论】:

标签: python-2.7 sorting dictionary


【解决方案1】:

默认排序是根据您无法控制的“第一个”键(对我来说似乎是字母,但我不确定 - 可能是根据键哈希)。这没有多大意义,让很多人感到惊讶。

详细说明,“第一”和“第二”的概念在字典中是未定义的。 按照设计,字典是哈希值,不能保证键的顺序。 如果两个具有相同键的不同字典以相同的顺序维护它们,这是一种技术方式 - 特别要记住键不必是字符串!因此,就您而言,首先选择“黑客”也可能是随机的。

因此您需要明确,这在 Python 3 中已强制执行。没有另一个库的一个选项(itemgetter 是通常的最爱):

sorted(student_data,key=lambda x: x['Rank'])

在 Python 3 中,如果你尝试sorted(student_data),则会抛出异常,因为 dict1

【讨论】:

  • 谢谢,但我想知道为什么选择第二个键来排序数据?
  • @GauravRathore 查看编辑。基本上,不能保证字典键的顺序,在你的情况下它恰好是“黑客”。因此,需要明确定义“dict1 应该在 dict2 之前”的含义。
【解决方案2】:

您必须指定排序列表的方式,在您的情况下,通过键排名的值:

from operator import itemgetter

student_data = [{'id':1, 'Hacker' : 'DOSHI', 'Rank' : 43},
 {'id':2, 'Hacker' : 'JOSHI', 'Rank' : 45},
 {'id':3, 'Hacker' : 'MOSHI', 'Rank' : 41},
 {'id':4, 'Hacker' : 'LOSHI', 'Rank' : 98},
 {'id':5, 'Hacker' : 'AOSHI', 'Rank' : 14}]
result = sorted(student_data, key=itemgetter('Rank')) 

print(result)

[{'id': 5, 'Hacker': 'AOSHI', 'Rank': 14}, {'id': 3, 'Hacker': 'MOSHI', 'Rank': 41}, {'id': 1, 'Hacker': 'DOSHI', 'Rank': 43}, {'id': 2, 'Hacker': 'JOSHI', 'Rank': 45}, {'id': 4, 'Hacker': 'LOSHI', 'Rank': 98}]

【讨论】:

    猜你喜欢
    • 2021-03-31
    • 2021-05-01
    • 2023-02-22
    • 1970-01-01
    • 2018-02-06
    • 2018-08-19
    • 1970-01-01
    • 2019-02-18
    • 1970-01-01
    相关资源
    最近更新 更多