python - 如何首先根据初始列表的单个元素将列表拆分为子列表,然后在python中将列表的连续部分拆分为子列表?

Posted

技术标签:

【中文标题】python - 如何首先根据初始列表的单个元素将列表拆分为子列表,然后在python中将列表的连续部分拆分为子列表?【英文标题】:How to split a list into sublists based on single elements of the initial list first and then contiguous portions of the list simply in python? 【发布时间】:2022-01-20 15:49:45 【问题描述】:

我过去一直在寻找如何做到这一点,但似乎找不到任何可以回答我的问题的东西,或者它的想法和代码对于我作为一个完整的初学者来说太复杂而无法理解。所以基本上这是我必须做的任务:

编写一个函数 all sublists(lst) ,列表 lst 作为其结果返回 a lst 的所有子列表的列表。子列表是包含连续部分的列表 原始的,即包括零个或多个连续的元素 原创。

例如,对于列表 [1, 2, 3],结果应该是

[[], [1], [2], [3], [1, 2], [2, 3], [1, 2, 3]]

我开始做的是创建一个包含所有数字的完整列表,然后将其拆分。但是我不能使用 split 函数,因为它是一个字符串,并且不知道正确拼接它的任何正确方法。

【问题讨论】:

这可能会帮助你***.com/questions/1482308/… 提示 - 尝试遍历您的列表,然后打印所有以该元素开头的子列表。 【参考方案1】:

这是一个使用双循环找到所需结果的函数。

def get_contiguous_sublists(lst):
    out = [[]]

    # find the length of the input list (added 1 for convenience which will be useful later)
    len_lst = len(lst) + 1
    
    # for each integer between 1 and the full length of the input list,
    # we slice the input list `lst` to create new lists of this length
    # and add it to the output list `out`
    for length in range(1, len_lst):
        # here, we are changing the starting point of the list slicing, 
        # i.e. whether we want to start from 1 or 2 or 3 for [1,2,3]
        for i in range(len_lst - length):
            out += [lst[i : i + length]]
    return out

输出:

>>> get_contiguous_sublists([1,2,3])
[[], [1], [2], [3], [1, 2], [2, 3], [1, 2, 3]]


>>> get_contiguous_sublists([1,2,3,4])
[[], [1], [2], [3], [4], [1, 2], [2, 3], [3, 4], [1, 2, 3], [2, 3, 4], [1, 2, 3, 4]]

【讨论】:

您好,由于我是初学者,因此我有一些关于此代码的问题,如果您能向我解释一下,那将是一个很大的帮助。 +号是什么意思 并且 [[]] 与空列表 [] 的含义相同吗 @AmalJaimon 因为我们正在创建一个列表列表,所以我们使用[[]] 对其进行了初始化,因为您希望空列表作为预期结果的一部分;如果您不想将空列表作为最终结果的一部分,则可以使用[]+ 符号用于向out 列表(即列表的列表)添加列表的切片(它本身就是一个列表)。 @AmalJaimon 我在答案代码中添加了 cmets 以进一步解释发生了什么。如果您还有其他问题,请告诉我。如果我的回答解决了您的问题,请考虑accepting,以便其他人可以看到此问题已解决。【参考方案2】:

使用itertools.combinations

from itertools import combinations

l = [1, 2, 3]
final = []
for i in range(len(l)+1):
  final += list(combinations(l,i))

print(final)

[(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]

【讨论】:

请注意,OP 并未要求所有组合,OP 的预期输出是 连续子列表 的列表,它是所有组合长度的子集。

以上是关于python - 如何首先根据初始列表的单个元素将列表拆分为子列表,然后在python中将列表的连续部分拆分为子列表?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python 将多个字符串元素列表转换为单个元素以逗号分隔的列表

如何将多个整数的列表转换为单个整数?

将字典列表的 Python 数据框列转换为具有单个元素的列

Python-根据范围转换列表中的值

python怎样创建具有一定长度和初始值的列表

如何将元素列表附加到数据框的单个特征中?