Python:根据值/条件创建子列表

时间:2019-02-16 16:25:11

标签: python python-3.x list

作为线性程序的结果,我从一个像这样的字典中得到了一个嵌套列表:

lst = [['a0', 1, 'x_01', 'p_01', 39],
       ['a0', 1, 'x_01', 'p_02', 19],
       ['a0', 1, 'x_02', 'p_01', 10],
       ['a0', 1, 'x_02', 'p_02', 5],
       ['a1', 1, 'x_01', 'y_01', 'p_01', 5],
       ['a1', 1, 'x_01', 'y_01', 'p_02', 5],
       ['a1', 1, 'x_02', 'y_01', 'p_02', 5],
       ['a1', 1, 'x_02', 'y_01', 'p_02', 5]]

任何一种'a'表示变量都是针对一组范围(例如1,'x_01','p_01'-等等)求解的,其值由列表的最后一个元素表示。

现在的任务是创建仅包含相同变量列表的子列表。 (在下一步中,它们将被传递到pd.df) 列表列表可能看起来像这样或类似的内容:

new_lst = [[['a0', 1, 'x_01', 'p_01', 39],
       ['a0', 1, 'x_01', 'p_02', 19],
       ['a0', 1, 'x_02', 'p_01', 10],
       ['a0', 1, 'x_02', 'p_02', 5]],
       [['a1', 1, 'x_01', 'y_01', 'p_01', 5],
       ['a1', 1, 'x_01', 'y_01', 'p_02', 5],
       ['a1', 1, 'x_02', 'y_01', 'p_02', 5],
       ['a1', 1, 'x_02', 'y_01', 'p_02', 5]]]

到目前为止,我尝试过的是:

st0 = list(set([x[0] for x in lst]))

获取所有唯一变量。

这,但是显然不能完成任务:

n = [x for x in lst for i in st0 if x[0]==i]

我在这里尝试的基于以下内容:

n1 = [x for x in lst if x[0]==st0[0]]
n2 = [x for x in lst if x[0]==st0[1]]
ii = [n1,n2]

基于模型大小,我有10、20个或更多个不同维度的不同变量。此外,模型需要运行几次以测试不同的参数。

可以进行硬编码,但不是必需的。如果有人有个好主意,请随时帮助我。

1 个答案:

答案 0 :(得分:3)

使用itertools.groupby

from itertools import groupby

lst = [['a0', 1, 'x_01', 'p_01', 39],
       ['a0', 1, 'x_01', 'p_02', 19],
       ['a0', 1, 'x_02', 'p_01', 10],
       ['a0', 1, 'x_02', 'p_02', 5],
       ['a1', 1, 'x_01', 'y_01', 'p_01', 5],
       ['a1', 1, 'x_01', 'y_01', 'p_02', 5],
       ['a1', 1, 'x_02', 'y_01', 'p_02', 5],
       ['a1', 1, 'x_02', 'y_01', 'p_02', 5]]

new_lst = []
s_lst = sorted(lst, key=lambda x: x[0])
for k, v in groupby(s_lst, key=lambda x: x[0]):
    new_lst.append(list(v))

print(new_lst)   

输出

[[['a0', 1, 'x_01', 'p_01', 39], 
  ['a0', 1, 'x_01', 'p_02', 19], 
  ['a0', 1, 'x_02', 'p_01', 10], 
  ['a0', 1, 'x_02', 'p_02', 5]], 
 [['a1', 1, 'x_01', 'y_01', 'p_01', 5], 
  ['a1', 1, 'x_01', 'y_01', 'p_02', 5], 
  ['a1', 1, 'x_02', 'y_01', 'p_02', 5], 
  ['a1', 1, 'x_02', 'y_01', 'p_02', 5]]]