12

我有以下代码,用于在 Python 中映射嵌套列表以生成具有相同结构的列表。

>>> nested_list = [['Hello', 'World'], ['Goodbye', 'World']]
>>> [map(str.upper, x) for x in nested_list]
[['HELLO', 'WORLD'], ['GOODBYE', 'WORLD']]

这可以仅通过列表理解来完成(不使用 map 函数)吗?

4

5 回答 5

15

对于嵌套列表,您可以使用嵌套列表推导:

nested_list = [[s.upper() for s in xs] for xs in nested_list]

就个人而言,我发现map在这种情况下更干净,尽管我几乎总是更喜欢列表推导。所以这真的是你的电话,因为任何一个都可以。

于 2009-08-20T14:45:39.300 回答
4

记住 Python 之禅:

通常有不止一种(可能还有几种)明显的方法来做到这一点。**

** 注意:为准确性而编辑。

无论如何,我更喜欢地图。

from functools import partial
nested_list = map( partial(map, str.upper), nested_list )
于 2013-03-14T20:12:07.093 回答
3

地图当然是一种更清洁的方式来做你想做的事。你可以嵌套列表推导,也许这就是你所追求的?

[[ix.upper() for ix in x] for x in nested_list]
于 2009-08-20T14:47:07.677 回答
2

这是具有任意深度的嵌套列表的解决方案:

def map_nlist(nlist=nlist,fun=lambda x: x*2):
    new_list=[]
    for i in range(len(nlist)):
        if isinstance(nlist[i],list):
            new_list += [map_nlist(nlist[i],fun)]
        else:
            new_list += [fun(nlist[i])]
    return new_list

你想大写所有你列出的元素,只需输入

In [26]: nested_list = [['Hello', 'World'], ['Goodbye', [['World']]]]
In [27]: map_nlist(nested_list,fun=str.upper)
Out[27]: [['HELLO', 'WORLD'], ['GOODBYE', [['WORLD']]]]

更重要的是,这个递归函数可以做的还不止这些!

我是python新手,欢迎讨论!

于 2014-10-01T03:31:47.853 回答
1

其他发帖者已经给出了答案,但是每当我无法将头绕在一个功能性构造上时,我都会忍住我的自豪感,并用明确的非最佳方法和/或对象将其拼写出来。你说你想要一个生成器,所以:

for xs in n_l:
    def doUpper(l):
        for x in l:
            yield x.upper()
    yield doUpper(xs)

for xs in n_l:
    yield (x.upper() for x in xs)

((x.upper() for x in xs) for xs in n_l)

有时保留其中一个速记版本会更干净。对我来说,map 和 reduce 有时会让它更明显,但 Python 习语对其他人来说可能更明显。

于 2009-08-20T21:50:24.950 回答