如何根据列表中的某些标志对列表列表进行分组和排序?

How to group and order list of lists based on certain flags in the list?

我正在处理一个自动化问题,我最终得到一个列表列表,看起来像这样:

in_list=[ ['data_1_1', 'id_1', True, False, False, False, 'data_1_5'],
          ['data_2_1', 'id_1', False, True, False, False, 'data_2_5'],
          ['data_3_1', 'id_2', True, False, False, False, 'data_3_5'],
          ['data_4_1', 'id_1', True, False, False, False, 'data_4_5'],
          ['data_5_1', 'id_1', False, True, False, False, 'data_5_5'],
          ['data_6_1', 'id_2', True, False, False, False, 'data_6_5'] ]

我想根据 id(每个列表中的第二个元素)对列表进行分组,并根据标志(列表的第三、第四、第五、第六个元素)对其进行排序,

预期输出:

out_list=[ ['data_1_1', 'id_1', True, False, False, False, 'data_1_5'],
           ['data_4_1', 'id_1', True, False, False, False, 'data_4_5'],
           ['data_2_1', 'id_1', False, True, False, False, 'data_2_5'],
           ['data_5_1', 'id_1', False, True, False, False, 'data_5_5'],
           ['data_3_1', 'id_2', True, False, False, False, 'data_3_5'],
           ['data_6_1', 'id_2', True, False, False, False, 'data_6_5'] ]

说明: out_list 以相同顺序分组 w.r.t id 并根据 True/False 标志进一步排序,(简单地说,具有相同标志集和相同 id 的列表放在一起)

到目前为止,我正在遍历整个列表列表并逐个元素检查既不是 pythonic 也不是可扩展的。有 faster/better 的方法吗?

您的预期输出不会对任何内容进行分组,只是对外部列表中的元素进行排序。

由于您想按 ID 排序,然后按标志排序,请使用包含这些元素的内部列表的一部分作为排序键

in_list=[ ['data_1_1', 'id_1', True, False, False, False, 'data_1_5'],
          ['data_2_1', 'id_1', False, True, False, False, 'data_2_5'],
          ['data_3_1', 'id_2', True, False, False, False, 'data_3_5'],
          ['data_4_1', 'id_1', True, False, False, False, 'data_4_5'],
          ['data_5_1', 'id_1', False, True, False, False, 'data_5_5'],
          ['data_6_1', 'id_2', True, False, False, False, 'data_6_5'] ]

sorted(in_list, key=lambda x: x[1:6])

这给出了这个:

[['data_2_1', 'id_1', False, True, False, False, 'data_2_5'],
 ['data_5_1', 'id_1', False, True, False, False, 'data_5_5'],
 ['data_1_1', 'id_1', True, False, False, False, 'data_1_5'],
 ['data_4_1', 'id_1', True, False, False, False, 'data_4_5'],
 ['data_3_1', 'id_2', True, False, False, False, 'data_3_5'],
 ['data_6_1', 'id_2', True, False, False, False, 'data_6_5']]

如果您想首先对 True 标志进行排序,则必须在 key 函数中将它们取反。

>>> sorted(in_list, key=lambda x: [x[1]] + [not f for f in x[2:6]])

[['data_1_1', 'id_1', True, False, False, False, 'data_1_5'],
 ['data_4_1', 'id_1', True, False, False, False, 'data_4_5'],
 ['data_2_1', 'id_1', False, True, False, False, 'data_2_5'],
 ['data_5_1', 'id_1', False, True, False, False, 'data_5_5'],
 ['data_3_1', 'id_2', True, False, False, False, 'data_3_5'],
 ['data_6_1', 'id_2', True, False, False, False, 'data_6_5']]