【问题标题】:Getting dictionary entries sorted by their keys获取按其键排序的字典条目
【发布时间】:2019-05-14 18:46:01
【问题描述】:

我有以下字典:

map = {'`s_h_o_seq_id`': 'STRING', '`s_h_o_identifier`': 'STRING', '`c`': 'STRING', '`c_system`': 'STRING', '`c_system_name`': 'STRING', '`display_name`': 'STRING', '`original_text`': 'STRING', '`status_c`': 'STRING', '`efc_time_high`': 'STRING', '`efc_time_low`': 'STRING', '`efc_time_v`': 'STRING', '`v_type`': 'STRING', '`v_text`': 'STRING', '`v_unit`': 'STRING', '`v_c`': 'STRING', '`v_c_system`': 'STRING', '`v_c_system_name`': 'STRING', '`v_c_display_name`': 'STRING', '`ctd_by`': 'STRING', '`ctd_date`': 'STRING', '`updtd_by`': 'STRING', '`updtd_date`': 'STRING', '`is_deleted`': 'STRING', '`pat_practice_id`': 'STRING', '`release`': 'STRING', '`section_name`': 'STRING', '`parent_entity_name`': 'STRING', '`class_c`': 'STRING', '`com_mood_c`': 'STRING', '`t_id_root`': 'STRING', '`t_id_extn`': 'STRING'}

我试图获取它的按键排序的条目列表,如下所示:

print(sorted(map.items(), key=lambda kv: (kv[0])))

打印出来:

[('`c_system_name`', 'STRING'), ('`c_system`', 'STRING'), ('`c`', 'STRING'), ('`class_c`', 'STRING'), ('`com_mood_c`', 'STRING'), ('`ctd_by`', 'STRING'), ('`ctd_date`', 'STRING'), ('`display_name`', 'STRING'), ('`efc_time_high`', 'STRING'), ('`efc_time_low`', 'STRING'), ('`efc_time_v`', 'STRING'), ('`is_deleted`', 'STRING'), ('`original_text`', 'STRING'), ('`parent_entity_name`', 'STRING'), ('`pat_practice_id`', 'STRING'), ('`release`', 'STRING'), ('`s_h_o_identifier`', 'STRING'), ('`s_h_o_seq_id`', 'STRING'), ('`section_name`', 'STRING'), ('`status_c`', 'STRING'), ('`t_id_extn`', 'STRING'), ('`t_id_root`', 'STRING'), ('`updtd_by`', 'STRING'), ('`updtd_date`', 'STRING'), ('`v_c_display_name`', 'STRING'), ('`v_c_system_name`', 'STRING'), ('`v_c_system`', 'STRING'), ('`v_c`', 'STRING'), ('`v_text`', 'STRING'), ('`v_type`', 'STRING'), ('`v_unit`', 'STRING')]

考虑上述输出列表中的前三个元组:

('`c_system_name`', 'STRING'), ('`c_system`', 'STRING'), ('`c`', 'STRING')

我希望它们以完全相反的顺序,即:

('`c`', 'STRING'), ('`c_system`', 'STRING'), ('`c_system_name`', 'STRING')

所以我试图去掉键中的那些单引号,以防它们造成麻烦:

sorted_map = sorted(map.items(), key=lambda kv: (kv[0][1:len(kv)-1]))

输出是:

[('`s_h_o_seq_id`', 'STRING'), ('`s_h_o_identifier`', 'STRING'), ('`c`', 'STRING'), ('`c_system`', 'STRING'), ('`c_system_name`', 'STRING'), ('`display_name`', 'STRING'), ('`original_text`', 'STRING'), ('`status_c`', 'STRING'), ('`efc_time_high`', 'STRING'), ('`efc_time_low`', 'STRING'), ('`efc_time_v`', 'STRING'), ('`v_type`', 'STRING'), ('`v_text`', 'STRING'), ('`v_unit`', 'STRING'), ('`v_c`', 'STRING'), ('`v_c_system`', 'STRING'), ('`v_c_system_name`', 'STRING'), ('`v_c_display_name`', 'STRING'), ('`ctd_by`', 'STRING'), ('`ctd_date`', 'STRING'), ('`updtd_by`', 'STRING'), ('`updtd_date`', 'STRING'), ('`is_deleted`', 'STRING'), ('`pat_practice_id`', 'STRING'), ('`release`', 'STRING'), ('`section_name`', 'STRING'), ('`parent_entity_name`', 'STRING'), ('`class_c`', 'STRING'), ('`com_mood_c`', 'STRING'), ('`t_id_root`', 'STRING'), ('`t_id_extn`', 'STRING')]

但这似乎把一切都搞砸了('s...' 出现在 'c...' 之前):

('`s_h_o_seq_id`', 'STRING'), ('`s_h_o_identifier`', 'STRING'), ('`c`', 'STRING')

为什么我的输出超过了输出,我怎样才能得到我想要的?

【问题讨论】:

  • 不...我知道我可以使用sorted(),这就是那个问题的答案。我的问题是为什么它对我/我的一组键不起作用,我在做什么错误。而且我确实犯了一个愚蠢的错误,即使用 len(kv) 而不是 len(kv[0]),您可以在下面的 cmets 和答案中阅读。

标签: python python-3.x


【解决方案1】:

这里的问题不是排序,而是你的键的内容。这些反引号在排序时也计算在内,并且反引号在下划线之后、小写字母之前进行排序:

>>> sorted(["`", "a", "_"])
['_', '`', 'a']

这就是为什么"`c_system_name`" 排在"`c_system`" 之前的原因,因为"`c_system`" 末尾的'`' 反引号字符排在"`c_system_...`" 中相同位置的下划线之后。

不带反引号的排序:

sorted(map.items(), key=lambda kv: kv[0].strip("`"))

或者不要创建带有反引号的键。

演示:

>>> print(sorted(map.items(), key=lambda kv: kv[0].strip("`")))
[('`c`', 'STRING'), ('`c_system`', 'STRING'), ('`c_system_name`', 'STRING'), ('`class_c`', 'STRING'), ('`com_mood_c`', 'STRING'), ('`ctd_by`', 'STRING'), ('`ctd_date`', 'STRING'), ('`display_name`', 'STRING'), ('`efc_time_high`', 'STRING'), ('`efc_time_low`', 'STRING'), ('`efc_time_v`', 'STRING'), ('`is_deleted`', 'STRING'), ('`original_text`', 'STRING'), ('`parent_entity_name`', 'STRING'), ('`pat_practice_id`', 'STRING'), ('`release`', 'STRING'), ('`s_h_o_identifier`', 'STRING'), ('`s_h_o_seq_id`', 'STRING'), ('`section_name`', 'STRING'), ('`status_c`', 'STRING'), ('`t_id_extn`', 'STRING'), ('`t_id_root`', 'STRING'), ('`updtd_by`', 'STRING'), ('`updtd_date`', 'STRING'), ('`v_c`', 'STRING'), ('`v_c_display_name`', 'STRING'), ('`v_c_system`', 'STRING'), ('`v_c_system_name`', 'STRING'), ('`v_text`', 'STRING'), ('`v_type`', 'STRING'), ('`v_unit`', 'STRING')]

str.strip() method 是一种比使用切片更好的删除反引号的方法,因为它会从开头和结尾删除零个或多个反引号,并保留其他字符。

您自己对kv[0][1:len(kv)-1] 的尝试使用了错误的len()len(kv) 始终是 2,你想要的是 len(kv[0])。并不是说您需要计算切片的长度,因为负切片已经从末尾开始计算:kv[0][1:-1] 删除了第一个和最后一个字符。

【讨论】:

  • 我还要补充一点,第二个 OP 的版本几乎可以工作,但应该是 key=kv[0][1:len(kv[0])-1]key=kv[0][1:-1]
  • @bereal:是的,我也在解决这个问题。
【解决方案2】:

您应该将len(kv) 更改为len(kv[0])

sorted_map = sorted(map.items(), key=lambda kv: (kv[0][1:len(kv[0])-1]))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-24
    • 2021-11-27
    • 2011-06-17
    • 1970-01-01
    • 2012-03-03
    • 2021-07-28
    • 2018-12-07
    相关资源
    最近更新 更多