解压列表列表列表

Unpacking a list of list of list

我在程序中使用的当前输入是坐标列表的列表:

data = [["D_02", "10", "10", "20"],
         ["X_03", "10", "10", "20"]]

为了方便使用,我也希望能够传递一个list of list:

have:

data = [[["B_01"], ["10"], ["10", "20"], ["10", "20"]],
             ["D_02", "10", "10", "20"],
             ["X_03", "10", "10", "20"]]

然后可以将其“分解”成如下所示:

want:

data = [["B_01", "10", "10", "10"],
        ["B_01", "10", "10", "20"],
        ["B_01", "10", "20", "10"],
        ["B_01", "10", "20", "20"],
        ["D_02", "10", "10", "20"],
        ["X_03", "10", "10", "20"]]

我知道可以使用 itertools 包的 product 函数对列表列表执行此操作:

import itertools
list(itertools.product(*data))

然而,

  1. 如何对列表的列表执行相同的操作?
  2. 如何在输入上循环以仅分解列表的列表?

仅当行的第一项是列表时才使用itertools.product:

final = []
for l in data:
    if isinstance(l[0], list):  # <- ["B01"]
        for c in itertools.product(*l[1:]):
            final.append(l[0] + list(c))
    else:
        final.append(l)
>>> final
[['B_01', '10', '10', '10'],
 ['B_01', '10', '10', '20'],
 ['B_01', '10', '20', '10'],
 ['B_01', '10', '20', '20'],
 ['D_02', '10', '10', '20'],
 ['X_03', '10', '10', '20']]