我有以下字典:
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')
为什么我的产出超过了我的水平,我怎么能得到自己想要的?
答案 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]))