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

时间:2020-11-02 20:05:38

标签: python python-3.x list sublist

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

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]

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

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

您可以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']

答案 2 :(得分:0)

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

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不知道如何将它们加在一起。使用联接功能可以添加字符和字符串。

相关问题