如何在python中从函数和现有嵌套列表创建新的嵌套列表?
做这件事最像蟒蛇的方式是什么?我不介意使用一些第三方库。 例如:如何在python中从函数和现有嵌套列表创建新的嵌套列表?,python,list,Python,List,做这件事最像蟒蛇的方式是什么?我不介意使用一些第三方库。 例如: [['a','b'],[['c'],[['d']]],['e']] -> [['A','B'],[['C'],[['D']]],['E']] 我可以用一种丑陋的方式来实现这一点,但我想要一种类似python的方式。只需使用递归将函数应用于列表以外的任何对象: def apply_recursive(ob, func): if not isinstance(ob, list): return func
[['a','b'],[['c'],[['d']]],['e']] -> [['A','B'],[['C'],[['D']]],['E']]
我可以用一种丑陋的方式来实现这一点,但我想要一种类似python的方式。只需使用递归将函数应用于列表以外的任何对象:
def apply_recursive(ob, func):
if not isinstance(ob, list):
return func(ob)
return [apply_recursive(elem, func) for elem in ob]
演示:
您可以扩展它以支持非字符串的任何序列:
from collections import Sequence
try:
string_type = basestring
except NameError:
string_type = str
def apply_recursive(ob, func):
if not isinstance(ob, Sequence) or isinstance(ob, string_type):
return func(ob)
return [apply_recursive(elem, func) for elem in ob]
它也支持元组:
>>> apply_recursive([('a','b'),[('c',),(['d'],)],['e']], str.upper)
[['A', 'B'], [['C'], [['D']]], ['E']]
我对大多数pythonic方法的建议是使用递归函数和列表理解,如下所示:
>>> def changer(li):
... return [i.upper() if not isinstance(i,list) else changer(i) for i in li]
...
演示:
在这个关头,这是非常不清楚的。是否要将列表列表中的每个条目大写?这与嵌套无关。这是肠衣?@ha9u63ar:我不知道你为什么说它与筑巢无关。列表中有不同的深度需要处理。问题还不够清楚。当我们处理嵌套时,嵌套的深度非常重要。通常我的原则是逐案处理。不要泛化你不需要的东西,因为有时候它根本不值得。我认为OP想要对元素应用任何泛型函数。@MartijnPieters我不这么认为!;)因为他什么都没说!
>>> def changer(li):
... return [i.upper() if not isinstance(i,list) else changer(i) for i in li]
...
>>> l=[['a','b'],[['c'],[['d']]],['e']]
>>> changer(l)
[['A', 'B'], [['C'], [['D']]], ['E']]