Python: создание подсписка на основе значений / условий - PullRequest
0 голосов
/ 16 февраля 2019

В результате линейной программы я получаю вложенный список из dict, который выглядит следующим образом:

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 голосов
/ 16 февраля 2019

Использование 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]]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...