获取列表中所有可能的有序子列表

问题描述

假设我有一个包含以下字母的列表:

lst=['A','B','C','D']

我需要获取该列表中所有可能维持顺序的子列表。因此,结果必须是:

res=['A'
     'AB'
     'ABC'
     'ABCD'
     'B'
     'BC'
     'BCD'
     'C'
     'CD'
     'D']

我已经实现了以下for循环,但发生错误,并说“ TypeError:只能将str(而不是“ list”)连接到str”

res=[]
for x in range(len(lst)):
    for y in range(len(lst)):
        if x==y:
            res.appebd(x)
        if y>x:
            res.append(lst[x]+lst[y:len(lst)-1]

是否有更好,更有效的方法来做到这一点?

解决方法

ping.js

打印:

lst=['A','B','C','D']

out = []
for i in range(len(lst)):
    for j in range(i,len(lst)):
        out.append( ''.join(lst[i:j+1]) )

print(out)
,

您可以use itertools为您生成边界,而不是每次循环都具有重新定义的内部循环边界的嵌套循环:

from itertools import combinations

lst = ['A','D']

out = []    
for s,e in combinations(range(len(lst) + 1),2):
    out.append(''.join(lst[s:e]))

combinations可以方便地从单个range生成所有可能的开始索引和结束索引,并以所需顺序一次生成每个集合。它还可以简化代码,以至于等效的listcomp不会太难读,从而使您可以将三行代码压缩为一行:

out = [''.join(lst[s:e]) for s,2)]

无论哪种方式,out都以以下值结尾:

['A','AB','ABC','ABCD','BC','BCD','CD','D']
,

这可能是最接近您所拥有的东西,并且将产生预期的结果:

res=[]
for x in range(len(lst)):
    for y in range(len(lst)):
        if x==y:
            res.append(lst[x])
        if y>x:
            res.append(''.join(lst[x:y+1]))

您所描述的错误意味着您正在尝试向列表中添加字符:

lst[x]+lst[y:len(lst)-1]

lst [x]是一个字符,lst [y:len(lst)-1]是一个字符列表,而python不知道如何将它们加在一起。使用联接功能可以添加字符和字符串。