【问题标题】:Triple list comprehension (flat list out of a list of arrays of lists of lists)三重列表理解(列表列表数组列表中的平面列表)
【发布时间】:2021-11-15 05:03:36
【问题描述】:

我一直在谷歌上搜索这个问题的答案,到目前为止,我只看到了针对不同问题的类似结果。

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

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

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

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

干杯!

【问题讨论】:

  • 请举个例子。 array 是什么?是np.array吗? “由于语法原因不起作用”是什么意思?请提供确切的错误(当然还有产生该错误的代码)。 “我不确定它是否够深”是什么意思?你的输入有更深的嵌套吗?你真的需要一个具体的例子。
  • 您认为for sublist for arr in listfor item in sublist in arr 是什么意思?请注意,for ... in ...一个 语法元素,而不是两个独立元素的组合。
  • [arr.tolist() for arr in alist] 将是一个开始。也许在适当的情况下使用arr.ravel().tolist() 甚至arr.item()
  • 如需更好的答案,请提供minimal reproducible example
  • @j1-lee,是的,它是一个 numpy 数组。抱歉,我假设“numpy”标签和对 numpy 操作的引用暗示了这一点,但我应该更清楚。 @MisterMiyagi,我看到 for ... in ... 是一个语法元素,因为我经常做简单的列表理解。但是,我仍在尝试破译嵌套列表理解的机制,考虑到双层遵循 item for sublist in list for item in sublistthis 帖子,这是我对三层的最佳猜测。

标签: python arrays numpy list-comprehension


【解决方案1】:

如果您的数组是一个元素,如您所示,您可以在理解时直接向下索引:

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]

【讨论】:

  • 您最初的[array[0][0] for array in list_of_lists_of_lists] 和@hpaulj 的[arr.item() for arr in alist] 一样完美,而我现在因为没有想到其中任何一个而感到愚蠢。我将把责任归咎于导致这个问题的 10 小时编码会议。我也很感谢您为这些目的包含深层嵌套列表理解语法,我相信我将来会使用它。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-13
  • 2013-06-24
  • 2017-11-28
  • 2014-08-26
  • 2023-04-08
相关资源
最近更新 更多