如何根据列表中的某些标志对列表列表进行分组和排序?
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']]
我正在处理一个自动化问题,我最终得到一个列表列表,看起来像这样:
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']]