Python:从不同大小和数据类型的单独列表创建一个N维列表

Python:从不同大小和数据类型的单独列表创建一个N维列表,python,arrays,list,numpy,nested-loops,Python,Arrays,List,Numpy,Nested Loops,假设我有这些清单: a = [1, 2, 3, 4] b = [6,7] c = ['a', 'b', 'c'] 我想创建一个三维数据结构,其中包含以所有可能的方式将每个列表的所有元素组合在一起的新列表。然后,我想使用类似矩阵的索引来访问这些新列表 例如,假设f是一个函数,它可以满足我的要求。然后我可以这样做: m = f(a,b,c) 然后m[0][0][0]将给出[1,6,'a'],m[1][0][0]将给出[2,6,'a'],依此类推 基本上,我知道我已经可以使用嵌套for循环来实现这

假设我有这些清单:

a = [1, 2, 3, 4]
b = [6,7]
c = ['a', 'b', 'c']
我想创建一个三维数据结构,其中包含以所有可能的方式将每个列表的所有元素组合在一起的新列表。然后,我想使用类似矩阵的索引来访问这些新列表

例如,假设f是一个函数,它可以满足我的要求。然后我可以这样做:

m = f(a,b,c)
然后m[0][0][0]将给出[1,6,'a'],m[1][0][0]将给出[2,6,'a'],依此类推

基本上,我知道我已经可以使用嵌套for循环来实现这一点

jList = []
for j in a:
    kList = []
    for k in b:
        lList = []
        for l in c:
            o = [j,k,l]
            lList.append(o)
        kList.append(lList)
    jList.append(kList)
这给了我一个列表列表列表

[[[[1, 6, 'a'], [1, 6, 'b'], [1, 6, 'c']], 
  [[1, 7, 'a'], [1, 7, 'b'], [1, 7, 'c']]], 
 [[[2, 6, 'a'], [2, 6, 'b'], [2, 6, 'c']], 
  [[2, 7, 'a'], [2, 7, 'b'], [2, 7, 'c']]], 
 [[[3, 6, 'a'], [3, 6, 'b'], [3, 6, 'c']], 
  [[3, 7, 'a'], [3, 7, 'b'], [3, 7, 'c']]], 
 [[[4, 6, 'a'], [4, 6, 'b'], [4, 6, 'c']], 
  [[4, 7, 'a'], [4, 7, 'b'], [4, 7, 'c']]]]
这很好,但我必须对大于3的维度执行此操作,而且许多嵌套的for循环似乎不可能是构建此类数据结构的最佳或最有效的方法。我忍不住想,一定有更好的解决方案,在一些库中,比如我上面编写的函数,可能是numpy函数,但是我做了很多搜索,没有找到像我这样的不同大小和数据类型的列表

有什么想法吗?

您可以使用列表的笛卡尔积,然后用于重塑,从列表的数量中提取最后一个维度,然后到最内层列表的长度,直到最外层列表的长度:

>>> args = a,b,c
>>> np.array(list(product(*args))).reshape(len(a), len(b), len(c), len(args))
array([[[['1', '6', 'a'],
         ['1', '6', 'b'],
         ['1', '6', 'c']],

        [['1', '7', 'a'],
         ['1', '7', 'b'],
         ['1', '7', 'c']]],


       [[['2', '6', 'a'],
         ['2', '6', 'b'],
         ['2', '6', 'c']],

        [['2', '7', 'a'],
         ['2', '7', 'b'],
         ['2', '7', 'c']]],


       [[['3', '6', 'a'],
         ['3', '6', 'b'],
         ['3', '6', 'c']],

        [['3', '7', 'a'],
         ['3', '7', 'b'],
         ['3', '7', 'c']]],


       [[['4', '6', 'a'],
         ['4', '6', 'b'],
         ['4', '6', 'c']],

        [['4', '7', 'a'],
         ['4', '7', 'b'],
         ['4', '7', 'c']]]],
      dtype='<U21')
或:

无需指定最后一个维度。

from itertools import product

a = [1, 2, 3, 4]
b = [6,7]
c = ['a', 'b', 'c']
data = [a,b,c]
dims = [range(len(i)) for i in data]
keys = product(*dims)
vals = (list(val) for val in product(*data))
space = dict(zip(keys,vals))
for key in space:
    print "{} -> {}".format(key, space[key])

因此,您希望
itertools.product
列表(itertools.product(a,b c))不会为您提供所需的嵌套,但在其他方面它看起来很完美。而且,它很容易扩展<代码>列表=[a,b,c]然后调用
list(itertools.product(*lists))
。如果以后要添加第四个iterable,可以执行
lists.append(d)
并调用
list(itertools.product(*lists))
@cᴏʟᴅsᴘᴇᴇᴅ 将子列表分组不是问题的一部分吗?@cᴏʟᴅsᴘᴇᴇᴅ: 不是一个精确的复制品,因为OP想要一个不同形状的结果。好吧,我的错。现在重新打开它。
new\u shape=list(map(len,args))+[len(args)]
>>> np.array(list(product(*args))).reshape(tuple(map(len, args)) + (-1,))
from itertools import product

a = [1, 2, 3, 4]
b = [6,7]
c = ['a', 'b', 'c']
data = [a,b,c]
dims = [range(len(i)) for i in data]
keys = product(*dims)
vals = (list(val) for val in product(*data))
space = dict(zip(keys,vals))
for key in space:
    print "{} -> {}".format(key, space[key])
(3, 0, 2) -> [4, 6, 'c']
(0, 1, 1) -> [1, 7, 'b']
(0, 1, 2) -> [1, 7, 'c']
(1, 0, 1) -> [2, 6, 'b']
(1, 0, 0) -> [2, 6, 'a']
(2, 0, 1) -> [3, 6, 'b']
(2, 0, 0) -> [3, 6, 'a']
(3, 1, 0) -> [4, 7, 'a']
(3, 1, 1) -> [4, 7, 'b']
(0, 0, 2) -> [1, 6, 'c']
(2, 0, 2) -> [3, 6, 'c']
(0, 0, 1) -> [1, 6, 'b']
(0, 0, 0) -> [1, 6, 'a']
(2, 1, 2) -> [3, 7, 'c']
(1, 1, 1) -> [2, 7, 'b']
(1, 0, 2) -> [2, 6, 'c']
(1, 1, 0) -> [2, 7, 'a']
(2, 1, 0) -> [3, 7, 'a']
(2, 1, 1) -> [3, 7, 'b']
(1, 1, 2) -> [2, 7, 'c']
(3, 0, 0) -> [4, 6, 'a']
(3, 1, 2) -> [4, 7, 'c']
(3, 0, 1) -> [4, 6, 'b']
(0, 1, 0) -> [1, 7, 'a']