展平部分列表

Flatten parts of list

我有这段代码创建了一个大小为 3 的列表列表。问题是其中一些列表列表的大小为 1,并且以这种方式嵌套:

[[['b']]]

并在另一个列表中找到。无论如何,是否只展平列表列表的一部分以从嵌套中删除这些大小为 1 的列表(无论它们嵌套的程度如何)但将它们保留为列表?这里有 2 个例子:

d = [[['a']], 'to', ['b']]

会变成:

d = [['a'], 'to', ['b']]

d1 = [[['c']], 'from', [['a'], 'to', [['b']]]]

会变成:

d1 = [['c'], 'from', [['a'], 'to', ['b']]]

我曾尝试使用 isinstance 并查看列表是否嵌套,然后替换该索引处的值,但没有成功。相反,我的代码一直在替换所有值并展平列表,这不是我的本意。我只希望将大小为 1 的嵌套列表减少为单个列表。这是我的尝试:

for index, value in enumerate(d1):
    if isinstance(value, list) and len(value) == 1:
        d1[index] = d1[index][0]

在您的第二个示例中,您在要展平的列表中有列表(3 层嵌套)。但是您的代码只查看 2 层嵌套:d[index]d[index][0] 因此您的解决方案仅适用于最外层的嵌套。同样,您的代码将在 [[[[[1]]]]] 这样的输入上失败。要修复它,您需要概括您的解决方案,这样它就不需要知道或关心嵌套列表的深度。

这是一个使用递归函数的解决方案 - 它不是解决问题的唯一方法,但它是最容易推理的方法,IMO。

def flatten(lst):
    # base case: if input is not a list, just return it
    if not isinstance(lst, list):
        return lst

    if len(lst) == 1:
        if isinstance(lst[0], list):
            # if input is a 1 element list and that element is itself
            # a list, then flatten it
            return flatten(lst[0])
        # ...otherwise return the input, it's already flattened
        return lst

    # when there are multiple entries in the input, flatten each
    return [flatten(x) for x in lst]