Создайте списки с 3 уровнями, содержащие каждую комбинацию значений подсписка (ов) - PullRequest
0 голосов
/ 23 ноября 2018

В настоящее время я застрял со следующей проблемой (я не смог найти решение, которое действительно здесь подходит):

У меня есть три списка a = [a, b, c], b = [1, 2, 3] и c = [0.1, 0.2, 0.3].

Я хотел бы создать списки списков списков (может быть, я должен использовать numy массивы?), Который содержит все комбинации между этими списками, но где каждый элемент в каждом подсписке также перебирается в bruce-forceкак шаблон, такой, что генерируется следующее:

mylist = [[[a, 1, 0.1], [b, 1, 0.1], [c, 1, 0.1]], [[a, 1, 0.1], [b, 1, 0.1], [c, 1, 0.2]], ... [[a, 2, 0.3], [b, 3, 0.3], [c, 1, 0.1]], ... [[a, 1, 0.3], [b, 1, 0.3], [c, 1, 0.3]], ... [[a, 3, 0.3], [b, 1, 0.3], [c, 3, 0.1]] ... [[a, 3, 0.3], [b, 3, 0.3], [c, 3, 0.3]]]

Я ценю, что это было бы равносильно чрезвычайно большому списку (рад получить совет о лучшем подходе!), но яфактически необходимо иметь трехмерный список с каждым подсписком, например, mylist [0], передаваемый как список, содержащий отдельные параметры подсписка (например, [[a, 3, 0.3], [b, 3, 0.3], [c, 3, 0.3]]] к алгоритму, который будет использовать их в качестве входных данных. Этот трехмерный список эффективно формирует все пространство параметров, которое необходимо будет «искать». Таким образом, вы можете понять, почему следующие примеры комбинаций:

[[a, 1, 0.3], [b, 2, 0.3], [c, 2, 0.3]], [[a, 3, 0.1], [b, 1, 0.3], [c, 2, 0.1]]

Важны, потому что они служат уникальным параметром для алгоритмического ввода.

Очень благодарен за любые указания по этому вопросу, спасибо.

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Генератор кажется хорошим подходом, чтобы не загромождать память.

import itertools as it
bc=list(it.product(b,c)) 
#[(1, 0.1), (1, 0.2), (1, 0.3), (2, 0.1), (2, 0.2), (2, 0.3), (3, 0.1), (3, 0.2), (3, 0.3)]
res = ([[u,*v] for u,v in zip(a,bc3)] for bc3 in it.product(*[bc]*3))

затем вы можете просканировать свое пространство с помощью:

 for list_of_list in res : 
    #compute  list_of_list

Первые значения:

In [49]: next(res) 
Out[49]: [['a', 1, 0.1], ['b', 1, 0.1], ['c', 1, 0.1]] 
In [50]: next(res) 
Out[50]: [['a', 1, 0.1], ['b', 1, 0.1], ['c', 1, 0.2]]

Вы можете получить массив с помощью arr = np.array(list(res),dtype=object).его форма (729,3,3).

0 голосов
/ 23 ноября 2018
import numpy as np 
import itertools as it
a = ['a', 'b', 'c']
b = [1, 2, 3]
c = [0.1, 0.2, 0.3]
l = np.array(np.meshgrid(a,b,c)).T
l = l.reshape(l.size//3,3)
subs = [[list(x) for x in l if x[0]==val] for val in a]
list(list(x) for x in it.product(*subs))

Попробуйте это.Это обобщает до a,b,c,d,... очевидным образом.

Тем не менее, вам не хватит памяти очень быстро.

...