Skip to main content
 首页 » 编程设计

python之如何对复杂的字典键进行排序

2025年05月04日18傻小

我处理了这些非常复杂的数据文件,在处理每个文件时,我使用 orderedDictionary 来捕获键和值。每个 orderedDictionary 都附加到一个列表中,所以我的最终结果是一个字典列表。由于这些文件中捕获的数据的多样性,它们有许多共同的键,但有足够多的不常见键使将数据导出到 Excel 比我希望的更复杂,因为我真的需要以一致的方式推出数据结构。

每个键的结构如下

Q_#_SUB_A_COLUMN_#_NUMB_# 

例如我有

 Q_123_SUB_D_COLUMN_C_NUMB_17 

我们可以如下翻译 key

 Question 123 
 SubItem D 
 Column C 
 Instance 17 

因为有一个子项 D、列 C 和实例 17,所以必须有一个子项 A、列 B 和实例 16

但是,其中一个源文件可能会填充数据值(并且范围不超过上述示例的键和其他一些源文件可能会以

Q_123_SUB_D_COLUMN_C_NUMB_13 

因此,当我遍历字典列表以提取所有唯一键实例时,我可以在 csv.dictwriter 中将它们用作列标题,我的计划是对生成的唯一列标题列表进行排序,但我做不到似乎可以进行排序

具体来说,我需要它进行排序,以便结果看起来像

 Q_122_SUB_A_COLUMN_C_NUMB_1 
 Q_122_SUB_B_COLUMN_C_NUMB_1 
 Q_123_SUB_A_COLUMN_C_NUMB_1 
 Q_123_SUB_B_COLUMN_C_NUMB_1 
 Q_123_SUB_C_COLUMN_C_NUMB_1 
 Q_123_SUB_D_COLUMN_C_NUMB_1 
 dot 
 dot 
 dot 
 Q_123_SUB_A_COLUMN_C_NUMB_17 
 Q_123_SUB_B_COLUMN_C_NUMB_17 
 Q_123_SUB_C_COLUMN_C_NUMB_17 
 Q_123_SUB_D_COLUMN_C_NUMB_17 

最大的问题是,在打开这些文件的任何特定集合之前,我不知道回答了多少问题,回答了多少子问题,每个问题或子问题关联了多少列,或者有多少列存在问题、子问题或列的任何特定组合的实例,我不想这样做。使用 Python,我能够将 1,200 多行 SAS 代码减少到 95 行,但是在我开始将其写入 CSV 文件之前的最后一点我似乎无法理解。

如有任何意见,我们将不胜感激。

我的计划是通过遍历字典列表找到所有唯一键,然后对这些键进行正确排序,这样我就可以使用这些键作为列标题创建一个 csv 文件。我知道我可以找到唯一键将其推出并手动对其进行排序,然后读回排序后的文件,但这看起来很笨拙。

请您参考如下方法:

排序时只需提供一个足够聪明的函数作为键即可。

>>> (lambda x: tuple(y(z) for (y, z)  
                     in zip((int, str, str, int),  
                            x.split('_')[1::2])))('Q_122_SUB_A_COLUMN_C_NUMB_1') 
(122, 'A', 'C', 1)