我相信你所寻找的是原始列表的所有可能片段.您想要的输出转换成切片是这样的:
a # slices[0:1]
b # slices[1:2]
c # slices[2:3]
d # slices[3:4]
a b # slices[0:2]
b c # slices[1:3]
c d # slices[2:4]
a b c # slices[0:3]
b c d # slices[1:4]
a b c d # slices[0:4]
所以你应该尝试生成的是那些索引.如果仔细观察并对它们进行排序,您可以看到它们是0到4之间的数字的2组合,其中第一个数字小于另一个数字 – 这正是itertools.combinations对索引列表的作用.所以我们可以生成这些:
for i, j in itertools.combinations(range(len(stuff) + 1), 2):
print(stuff[i:j])
这会产生以下输出:
['a']
['a', 'b']
['a', 'b', 'c']
['a', 'b', 'c', 'd']
['b']
['b', 'c']
['b', 'c', 'd']
['c']
['c', 'd']
['d']
优点是,这会产生输入的实际子列表,并不关心首先是单个字符的那些.它可以是列表中的任何类型的内容.
如果输出顺序具有任何重要性,您可以按输出列表大小排序以获得所需的结果:
def getCombinations (lst):
for i, j in itertools.combinations(range(len(lst) + 1), 2):
yield lst[i:j]
for x in sorted(getCombinations(stuff), key=len):
print(' '.join(x))