如何用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
相关产品推荐
相关产品推荐

