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

Get all possible ordered sublists of a list

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

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

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

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

我已经实现了以下 for 循环,但出现错误,提示“TypeError:Can only concatenate str (not "list) to 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]

有没有更好更有效的方法?

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)

打印:

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

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

from itertools import combinations

lst = ['A','B','C','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, e in combinations(range(len(lst) + 1), 2)]

无论哪种方式,out 最终的值是:

['A', 'AB', 'ABC', 'ABCD', 'B', 'BC', 'BCD', 'C', '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 不知道如何将它们相加。它可以通过使用连接函数来添加一个字符和一个字符串。