三重列表理解(列表列表数组列表中的平面列表)

Triple list comprehension (flat list out of a list of arrays of lists of lists)

我一直在 Google 寻找这个问题的答案,到目前为止只看到不同问题的相似结果。

我的list of lists的结构如下(编辑:数组是numpy的): [array([[item]]), array([[item2]]), ...]

如您所见,这并不是格式不一致(这是在之前的操作中使用了 numpy 列向量的结果)。我想使用 1 行列表理解将其扁平化为一个简单的值列表。类似的问题包括可变大小的子列表或子列表,我不必担心。

对我来说最有意义的“解决方案”: [item for sublist for arr in list for item in sublist in arr] 但由于语法原因,这不起作用,更不用说我不确定它是否足够深入。

我想知道这是否可能,是否有比我聪明的人能提出解决方案。对时间不敏感,我们已经满足于散点图......现在。

干杯!

如果你的数组像你展示的那样只有一个元素,你可以在理解时直接向下索引:

list_of_lists_of_lists = [[[item1]], [[item2]], ...]
[array[0][0] for array in list_of_lists_of_lists]

如果你的数组比较复杂,你可以嵌套 for x in y 语句,你只需要按正确的顺序排列它们:

list_of_lists_of_lists = [[[item1]], [[item2], [item5]], [[item3, item4]]]
[item for lists_of_lists in list_of_lists_of_lists for sublist in lists_of_lists for item in sublist]

这将按顺序产生它们:

[item1, item2, item5, item3, item4]

最后,如果您不知道它有多深但您确实知道您的项目的类型,您可以随时执行递归搜索:

test = [[[1]], [[2], [5]], [[[3], 4]], [[[[[[6]]]]]]]
result = list()
my_type = int
def generator(my_list, accumulator):
    if isinstance(my_list, my_type):
        accumulator.append(my_list)
        return
    for item in my_list:
        generator(item, accumulator)
gen(test, result)

这会给你结果 = [1, 2, 5, 3, 4, 6]