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

2024-05-29 04:44:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下词典:

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

为什么我得到了以上的产出,我怎样才能得到我想要的?你知道吗


Tags: textnameidmapdatestringbytime
2条回答

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

sorted_map = sorted(map.items(), key=lambda kv: (kv[0][1:len(kv[0])-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')]

^{} method是一种比使用切片更好的删除反记号的方法,因为它将从开始和结束处删除零个或多个反记号,而不影响其他字符。你知道吗

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

相关问题 更多 >

    热门问题