如何从函数和python中的现有嵌套列表创建新的嵌套列表?

时间:2015-03-20 15:27:22

标签: python list

最蟒蛇的方法是什么?我不介意使用一些第三方库。 例如:

[['a','b'],[['c'],[['d']]],['e']] -> [['A','B'],[['C'],[['D']]],['E']]

我可以用丑陋的方式做到这一点,但我想要一种pythonic方式。

2 个答案:

答案 0 :(得分:1)

只需使用递归将函数应用于不是列表的任何内容:

def apply_recursive(ob, func):
    if not isinstance(ob, list):
        return func(ob)
    return [apply_recursive(elem, func) for elem in ob]

演示:

>>> def apply_recursive(ob, func):
...     if not isinstance(ob, list):
...         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']]

您可以对此进行扩展以支持任何非字符串序列:

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']]

答案 1 :(得分:0)

我对最pythonic 方式的建议是使用递归函数和列表推导如下:

>>> 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']]