获取列表的所有可能的有序子列表
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 不知道如何将它们相加。它可以通过使用连接函数来添加一个字符和一个字符串。
假设我有一个包含以下字母的列表:
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 不知道如何将它们相加。它可以通过使用连接函数来添加一个字符和一个字符串。