我有以下代码,用于在 Python 中映射嵌套列表以生成具有相同结构的列表。
>>> nested_list = [['Hello', 'World'], ['Goodbye', 'World']]
>>> [map(str.upper, x) for x in nested_list]
[['HELLO', 'WORLD'], ['GOODBYE', 'WORLD']]
这可以仅通过列表理解来完成(不使用 map 函数)吗?
我有以下代码,用于在 Python 中映射嵌套列表以生成具有相同结构的列表。
>>> nested_list = [['Hello', 'World'], ['Goodbye', 'World']]
>>> [map(str.upper, x) for x in nested_list]
[['HELLO', 'WORLD'], ['GOODBYE', 'WORLD']]
这可以仅通过列表理解来完成(不使用 map 函数)吗?
对于嵌套列表,您可以使用嵌套列表推导:
nested_list = [[s.upper() for s in xs] for xs in nested_list]
就个人而言,我发现map
在这种情况下更干净,尽管我几乎总是更喜欢列表推导。所以这真的是你的电话,因为任何一个都可以。
记住 Python 之禅:
通常有不止一种(可能还有几种)明显的方法来做到这一点。**
** 注意:为准确性而编辑。
无论如何,我更喜欢地图。
from functools import partial
nested_list = map( partial(map, str.upper), nested_list )
地图当然是一种更清洁的方式来做你想做的事。你可以嵌套列表推导,也许这就是你所追求的?
[[ix.upper() for ix in x] for x in nested_list]
这是具有任意深度的嵌套列表的解决方案:
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新手,欢迎讨论!
其他发帖者已经给出了答案,但是每当我无法将头绕在一个功能性构造上时,我都会忍住我的自豪感,并用明确的非最佳方法和/或对象将其拼写出来。你说你想要一个生成器,所以:
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 习语对其他人来说可能更明显。