Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中从函数和现有嵌套列表创建新的嵌套列表?_Python_List - Fatal编程技术网

如何在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']]