将嵌套的字符串列表转换为字符串列表

Convert nested list of strings to list of string

我有一个双重嵌套字符串列表,我需要将其转换为嵌套字符串列表。我在网上找到了一些帮助,但有些单词丢失了或者列表被排序了。

new_list = [[['SOCCER'],['-'],['JAPAN'],['GET'],['LUCKY'],['WIN'],[','],['CHINA'],['IN'],
  ['SURPRISE'],['DEFEAT'],['.']]]
### Expected Result [['SOCCER', '-', 'JAPAN', 'GET', 'LUCKY', 'WIN', ',', 'CHINA', 'IN', 'SURPRISE', 'DEFEAT', '.'], ...

alot = [[ele for ele in sub] for sub in new_list]
outlst = [' '.join([str(c) for c in lst]) for lst in new_list]

一种方法是使用 chain.from_iterable:

from itertools import chain

new_list = [[['SOCCER'],['-'],['JAPAN'],['GET'],['LUCKY'],['WIN'],[','],['CHINA'],['IN'],
  ['SURPRISE'],['DEFEAT'],['.']]]

result = [list(chain.from_iterable(e)) for e in new_list]
print(result)

输出

[['SOCCER', '-', 'JAPAN', 'GET', 'LUCKY', 'WIN', ',', 'CHINA', 'IN', 'SURPRISE', 'DEFEAT', '.']]

另一种是使用nested list comprehension:

result = [[s for lst in e for s in lst] for e in new_list]

每当我遇到嵌套或分形问题时,我倾向于使用递归。

对于这类挑战,最好的方法是使用递归。

递归函数是在某些点调用自身的函数。要创建递归函数,您应该遵循两步规则:

  1. 创建退出条件
  2. 再次调用函数

在这里你可以有一个函数来获取每个元素并检查该元素是否是一个列表。如果是,它会再次调用自己并扩展到一个空列表,否则它会将非列表值附加到空列表。

这样无论深度如何,您都可以展平嵌套列表。

def flatten(data):
    ret = []
    for each in data:
        if isinstance(each, list):
            ret.extend(flatten(each))
        else:
            ret.append(each)

    return ret

注意:Python 中的递归不是您想要的,因为 Python 不擅长它。参见:Thomas Wouters's answer