最蟒蛇的方法是什么?我不介意使用一些第三方库。 例如:
[['a','b'],[['c'],[['d']]],['e']] -> [['A','B'],[['C'],[['D']]],['E']]
我可以用丑陋的方式做到这一点,但我想要一种pythonic方式。
答案 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']]