获取按字典键排序的字典条目

时间:2019-05-14 10:32:41

标签: python python-3.x

我有以下字典:

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')

为什么我的产出超过了我的水平,我怎么能得到自己想要的?

2 个答案:

答案 0 :(得分:4)

这里的问题不是排序,而是键的内容。这些反引号也在排序时计数,反引号在下划线之后但在小写字母之前排序:

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

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

不带反引号的排序:

"`c_system_...`"

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

演示:

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

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

您对>>> 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')] 的尝试使用了错误的kv[0][1:len(kv)-1]len()始终为len(kv),而您想要2。不必再计算切片的长度,因为负片已经从末尾开始计数:len(kv[0])删除了第一个和最后一个字符。

答案 1 :(得分:1)

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

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