You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python3从列表生成所有相邻元素组成的连续字符串?

高效生成相邻元素连续子串列表的实现方式

你说的这个需求其实是要生成原列表的所有连续非空子序列,和幂集的核心区别就是只保留相邻元素的连续组合——itertools.combinations()确实不适用,因为它会生成所有元素的组合(不管是否相邻),比如你提到的toaster和door这种非相邻配对,完全不符合你的要求。

最优实现方案

这类问题的最优时间复杂度是O(n²),因为最终要生成的结果数量是固定的n(n+1)/2个(比如n=3时就是3+2+1=6个),没法再优化到更低复杂度了。这里给你两种实用的实现方式:

1. 逻辑清晰的双重循环写法

这种写法直观易懂,方便后续调试和修改:

def get_consecutive_substrings(lst):
    result = []
    # 遍历每个子序列的起始位置
    for start_idx in range(len(lst)):
        current_sequence = []
        # 从起始位置开始,逐步往后扩展子序列
        for end_idx in range(start_idx, len(lst)):
            current_sequence.append(lst[end_idx])
            result.append(' '.join(current_sequence))
    return result

# 测试示例
original_list = ["toaster", "oven", "door"]
print(get_consecutive_substrings(original_list))
# 输出:['toaster', 'toaster oven', 'toaster oven door', 'oven', 'oven door', 'door']

2. 简洁的列表推导式写法

如果追求代码简洁,可以用嵌套列表推导式,效率和上面的循环完全一致:

original_list = ["toaster", "oven", "door"]
result = [' '.join(original_list[i:j+1]) for i in range(len(original_list)) for j in range(i, len(original_list))]
print(result)

为什么itertools.combinations()不适用?

举个具体的例子,当你用combinations(original_list, 2)时,它会返回:

('toaster', 'oven'), ('toaster', 'door'), ('oven', 'door')

这里面的('toaster', 'door')就是非相邻元素的组合,而且它只能生成固定长度的元素对,没法生成像toaster oven door这种长度递增的连续拼接结果,所以完全不符合你的需求。

内容的提问来源于stack exchange,提问作者django-d

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:21:56