Python 大写字符串列表列表

Python capitalize list of lists of strings

我正在尝试将列表中的每个字符串大写 python 3. 我正在使用此代码

def capitalize_nested(t):
    res=[]
    for s in t:
        if isinstance(s,list):
            capitalize_nested(s)
        res.append(s.capitalize())
    return res

该代码适用于字符串列表,但不适用于字符串列表的列表,例如当我 运行 它为 t=["asd",["asd"]] 我希望 ["Asd",["Asd"]] 作为输出,而不是我得到以下错误:

Traceback (most recent call last):                                                                                             
  File "/home/main.py", line 10, in <module>                                                                                   
    print(capitalize_nested(t))                                                                                                
  File "/home/main.py", line 6, in capitalize_nested                                                                           
    res.append(s.capitalize())                                                                                                 
AttributeError: 'list' object has no attribute 'capitalize'

我不明白这个错误是什么意思。为什么代码将递归中子列表的元素视为列表而不是字符串?

问题是您直接调用 capitalize_nested 而不是在代码的一个分支中附加 capitalize_nested。试试这个:

def capitalize_nested(t):
    res=[]
    for s in t:
        if isinstance(s,list):
            res.append(capitalize_nested(s))
        else:
            res.append(s.capitalize())
    return res

在您的代码中,如果 s 的类型是列表,那么在执行 if 语句的内部之后,编译器还将调用 capitalize 方法(未为列表定义 s).所以你需要一个 else 语句。您还必须附加重复的结果:

def capitalize_nested(t):
    res=[]
    for s in t:
        if type(s) == list:
            res.append(capitalize_nested(s))
        else:
            res.append(s.capitalize())
    return res


print capitalize_nested(['asd', ['asd',]])

这应该输出:

['Asd', ['Asd']]

错误已经告诉你问题所在:你正试图在列表中调用 capitalize,这是不可能的。

这样做的原因:如果 s 是一个列表,那么您正在递归调用您的函数,这很好。但是在递归调用 returns 之后,你调用了 res.append(s.capitalize()),这给了你错误,因为 s 是一个列表,因此没有 capitalize() 函数。

最好这样做:

def capitalize_nested(t):
    res=[]
    for s in t:
        if isinstance(s, list):
            to_append = capitalize_nested(s)
        else:
            to_append = s.capitalize()
        res.append(to_append)
    return res

示例:

输入:["asd",["asd"]]

输出:['Asd', ['Asd']]

注意:当然,这不是最优雅或最漂亮的解决方案,但我不想过多更改您的代码,希望它能解释问题。