【问题标题】:Function that takes a nested list of strings and returns a new nested list with all strings capitalized?采用嵌套字符串列表并返回所有字符串大写的新嵌套列表的函数?
【发布时间】:2012-12-11 01:14:25
【问题描述】:

这会将它们大写,但前提是没有嵌套列表。

t = ['this','that', ['other']]

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

print capitalize_nested(t)

我不知道如何让它打印出所有字符串都以大写字母开头的嵌套列表。我一定遗漏了一些明显的东西,这让我很难过。

【问题讨论】:

  • 是否需要支持任意嵌套列表(无限深度)?
  • 暂时不会,但最终可能会

标签: python function capitalize


【解决方案1】:
def cap(L):
    for i,elem in enumerate(L):
         if isinstance(elem, str):
             L[i] = elem.capitalize()
         elif isinstance(elem, list):
             cap(L[i])

【讨论】:

  • 如果您就地修改列表,则不应返回非 None 值。
  • @J.F.Sebastian:非常正确。修改
  • 该函数预计不会返回值,因此可以完全删除if:return/elsefor i, elem, in enumerate(L) 将处理空列表。
  • @J.F.塞巴斯蒂安:是的。但为了 OP,我试图明确表达
【解决方案2】:

递归解决方案是第一个解决方案和最漂亮的解决方案,但并不总是最好的解决方案,请检查这个迭代解决方案:

def capitalize(t):
    lists = [t]
    while lists:
        l = lists.pop()
        for i, item in enumerate(l):
            if isinstance(item, list):
                lists.append(item)
            else:
                l[i] = item.capitalize()

【讨论】:

  • 您正在使用 lists 作为堆栈,通过在迭代时附加到它。我不确定 Python 语言是否能保证这种语义,但它适用于 Python 2.x、3.x、Pypy、Jython。我在the similar solution 中使用了明确的while stack: lst = stack.pop()
  • @J.F.Sebastian 谢谢你的提示,我刚刚改进了代码。
【解决方案3】:

这是一个支持任意深度嵌套列表的版本:

from collections import MutableSequence

def capitalize_inplace(nested_list):
    stack = [nested_list]
    while stack:
        lst = stack.pop()
        for i, item in enumerate(lst):
            if isinstance(item, MutableSequence):
                stack.append(item)
            else:
                lst[i] = item.capitalize()

示例

L = ['this', 'that', ['other'], ['may',['be', ['nested'], 'further']]]
capitalize_inplace(L)
print(L)
# -> ['This', 'That', ['Other'], ['May', ['Be', ['Nested'], 'Further']]]

【讨论】:

    【解决方案4】:

    使用递归解决方案(并且使用列表推导也有助于使其更紧凑):

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

    例如:

    print capitalize_nested(['this', 'that', ['other']])
    # ['This', 'That', ['Other']]
    

    【讨论】:

    • @Amber:好主意,已更改(尽管问题只要求嵌套列表)。
    • @Amber:实际上我刚刚意识到我根本做不到,因为isinstance("this", collections.Sequence)(调用一个字符串)返回 True,所以它会在每个字符串上无限递归。跨度>
    • 是的。也许看看有问题的东西是不是不是一个字符串会更安全。
    【解决方案5】:

    只需检查s 是否是一个列表,然后递归调用您的capitalize_nested 函数:

    t = ['this','that', ['other']]
    
    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(t)
    

    【讨论】:

      猜你喜欢
      • 2016-02-08
      • 2013-11-05
      • 2015-05-09
      • 2019-07-07
      • 2021-11-25
      • 1970-01-01
      • 2014-12-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多