python列表理解;压缩列表列表?

2024-05-12 20:26:38 发布

您现在位置:Python中文网/ 问答频道 /正文

伙计们。我试图找到一个问题的最优雅的解决方案,并想知道python是否有任何内置的东西来解决我正在尝试的问题。

我要做的就是这个。我有一个列表,A,还有一个函数f,它接受一个项并返回一个列表。我可以使用列表理解来转换A中的所有内容,就像这样

[f(a) for a in A]

但这会返回一个列表列表

[a1,a2,a3] => [[b11,b12],[b21,b22],[b31,b32]]

我真正想要的是得到扁平化的清单

[b11,b12,b21,b22,b31,b32]

现在,其他语言也有了它;在函数式编程语言中,它传统上被称为flatmap,.Net将其称为SelectMany。python有类似的东西吗?有没有一种简洁的方法可以将一个函数映射到一个列表上并将结果展平?

我要解决的实际问题是:从目录列表开始,查找所有子目录。所以;

import os
dirs = ["c:\\usr", "c:\\temp"]
subs = [os.listdir(d) for d in dirs]
print subs

currently给了我一个列表,但我真的想要一个列表。


Tags: 函数in列表foros解决方案subsdirs
3条回答
>>> listOfLists = [[1, 2],[3, 4, 5], [6]]
>>> reduce(list.__add__, listOfLists)
[1, 2, 3, 4, 5, 6]

我猜itertools的解决方案比这个更有效,但是这感觉很像python,并且避免了仅仅为了一个列表操作而导入库。

你可以在itertools' recipes:中找到一个好的答案

def flatten(listOfLists):
    return list(chain.from_iterable(listOfLists))

(注意:需要Python2.6+)

您可以在单个列表理解中进行嵌套迭代:

[filename for path in dirs for filename in os.listdir(path)]

相关问题 更多 >