代码之家  ›  专栏  ›  技术社区  ›  Yonathan

串联嵌套列表中的字符[重复]

  •  0
  • Yonathan  · 技术社区  · 7 年前

    我目前使用的数据结构如下所示:

    ['t','h','i','s',' ','i','s',' ','q','u','e','r','y',' ','i','t','e','m',' ','1','t','h','i','s',' ','i','s',' ','q','u','e','r','y',' ','i','t','e','m',' ','2', ['t','h','i','s',' ','i','s',' ','a',' ','s','u','b','q','u','e','r','y'], 't','h','i','s',' ','i','s',' ','q','u','e','r','y',' ','i','t','e','m',' ','3']
    

    我通过解析查询字符串获得此数据集,该查询字符串使用来自SO的以下答案: https://stackoverflow.com/a/17141441

    我分析的查询是:

    (this is query item 1 this is query item 2(this is a subquery)this is query item 3)
    

    问题是,它处理逐个附加到列表中的单个字符。我需要回到一个像这样的结构:

    ['this is query item 1 this is query item 2', ['this is a subquery'], 'this is query item 3']
    

    我试着围绕解析器函数来做这件事,或者做一个后处理步骤来将字符重新组合在一起。有人知道这个问题的解决方案吗?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Dani Mesejo    7 年前

    作为后处理步骤,您可以使用 itertools.groupby 在递归函数中:

    from itertools import groupby
    
    data = ['t', 'h', 'i', 's', ' ', 'i', 's', ' ', 'q', 'u', 'e', 'r', 'y', ' ', 'i', 't', 'e', 'm', ' ', '1', 't', 'h',
            'i', 's',
            ' ', 'i', 's', ' ', 'q', 'u', 'e', 'r', 'y', ' ', 'i', 't', 'e', 'm', ' ', '2',
            ['t', 'h', 'i', 's', ' ', 'i', 's', ' ', 'a', ' ', 's', 'u', 'b', 'q', 'u', 'e', 'r', 'y'], 't', 'h', 'i', 's',
            ' ', 'i', 's', ' ', 'q', 'u', 'e', 'r', 'y', ' ', 'i', 't', 'e', 'm', ' ', '3']
    
    
    def join(lst):
        for is_list, group in groupby(lst, key=lambda x: isinstance(x, list)):
            if is_list:
                yield from (list(join(value)) for value in group)
            else:
                yield ''.join(group)
    
    
    result = list(join(data))
    print(result)
    

    输出

    ['this is query item 1this is query item 2', ['this is a subquery'], 'this is query item 3']
    

    这将为列表和字符创建组,如果组是字符之一,请使用内置的 join 函数,否则递归调用join函数。