python-3.x 展平多重嵌套列表

w3nuxt5m  于 12个月前  发布在  Python
关注(0)|答案(3)|浏览(114)

假设我有一个多重嵌套的列表,其结构如下:

['p', [['p', 'q'], [['~p', '~r'], [['r', '~s'], ['s', '~q']]]]]

其中嵌套列表的每两个元素都是另一个嵌套列表(除了最里面的列表),我想输出提取所有带有字符串的列表,这样我的输出显示如下:

['p', ['p', 'q'], ['~p', '~r'], ['r', '~s'], ['s', '~q']]

我实现了以下代码:

def flatten_nested_list(nested_list):
    flat_list = []
    for item in nested_list:
        if isinstance(item, list) and isinstance(item[1], list):
            flat_list.append(item[0])
            flat_list.extend(flatten_nested_list(item[1]))
        else:
            flat_list.append(item)
    return flat_list

nested_list = ['p', [['~p', 'q'], [['~p', '~r'], [['r', '~s'], ['s', '~q']]]]]
flat_result = flatten_nested_list(nested_list)
print(flat_result)

然而,我的函数没有正确处理最里面的列表,我的输出如下:

['p', ['~p', 'q'], ['~p', '~r'], ['r', '~s'], 's', '~q']

是否可以建议任何更改,以便正确处理最内层的列表?

nxagd54h

nxagd54h1#

IIUC,你可以使用递归:

lst = ["p", [["p", "q"], [["~p", "~r"], [["r", "~s"], ["s", "~q"]]]]]

def flatten(lst):
    if isinstance(lst[-1], list):
        yield lst[0]
        yield from flatten(lst[-1])
    else:
        yield lst

print(list(flatten(lst)))

图纸:

['p', ['p', 'q'], ['~p', '~r'], ['r', '~s'], ['s', '~q']]

编辑:

lst = ["p", [["~p", "q"], [["~q", "r"], "~r"]]]

def flatten(lst):
    match [lst[0], lst[1]]:
        case str(), list():
            yield lst[0]
            yield from flatten(lst[1])
        case list(), list():
            yield from flatten(lst[0])
            yield from flatten(lst[1])
        case list(), str():
            yield from flatten(lst[0])
            yield lst[1]
        case _:
            yield lst

print(list(flatten(lst)))

图纸:

['p', ['~p', 'q'], ['~q', 'r'], '~r']
bfrts1fy

bfrts1fy2#

假设列表的格式与上面描述的一致,我认为你可以跟踪一个布尔变量(下面代码中的hasList)来跟踪列表中的第二个元素是否是嵌套列表。如果没有,您可以将返回的列表包含在另一个列表中,以避免上面的flatten问题

def flatten_nested_list(nested_list):
    flat_list = []
    hasList = False
    for item in nested_list:
        if isinstance(item, list) and isinstance(item[1], list):
            flat_list.append(item[0])
            flat_list.extend(flatten_nested_list(item[1]))
            hasList = True
        else:
            flat_list.append(item)
    
    if hasList:
        return flat_list
    else:
        return [flat_list]

nested_list = ['p', [['~p', 'q'], [['~p', '~r'], [['r', '~s'], ['s', '~q']]]]]
flat_result = flatten_nested_list(nested_list)
print(flat_result)
avwztpqn

avwztpqn3#

线性时间解(其他答案需要二次时间):

def flatten_nested_list(nested_list):
    flat_list = []
    while isinstance(nested_list[1], list):
        item, nested_list = nested_list
        flat_list.append(item)
    flat_list.append(nested_list)
    return flat_list

相关问题