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