Python 在给定字符串中查找所有可能的子序列

Python 在给定字符串中查找所有可能的子序列,python,combinations,subsequence,Python,Combinations,Subsequence,我已经编写了这段代码,它打印给定字符串的所有子字符串,但我希望它打印所有可能的子序列 from itertools import combinations_with_replacement s = 'MISSISSIPPI' lst = [] for i,j in combinations_with_replacement(range(len(s)), 2): print(s[i:(j+1)]) 一个简单的方法是验证您正在创建的列表是否已经包含您正在迭代的案例。如果您已经看到

我已经编写了这段代码,它打印给定字符串的所有子字符串,但我希望它打印所有可能的子序列

from itertools import combinations_with_replacement
s = 'MISSISSIPPI'
lst = []
for i,j in combinations_with_replacement(range(len(s)), 2):
        print(s[i:(j+1)])


一个简单的方法是验证您正在创建的列表是否已经包含您正在迭代的案例。如果您已经看到它,则跳过它,如果没有,则将其附加到已看到的组合列表中

from itertools import combinations_with_replacement

s = 'MISSISSIPPI'
lst = []

for i,j in combinations_with_replacement(range(len(s)), 2):
    if s[i:(j+1)] not in lst:
        lst.append(s[i:(j+1)]) # save new combination into list
        print(lst[-1]) # print new combination
为了确保涵盖了所有情况,绘制循环将要遍历的组合图确实很有帮助。假设一个通用字符串,其中字母由它们在python列表中的位置表示,例如0到3

以下是“组合与替换”生成的数字

00,01,02,03,
11、12、13、
22,23,

33

使用
组合
获得子序列。这就是组合的作用

来自itertools导入组合的

定义所有_子序列:
out=set()
对于范围(1,透镜+1)内的r:
对于组合(s,r)中的c:
out.add(“”.join(c))
已分拣的退货(已分拣)
例如:

>>所有子序列(“你好”)
[E]、[EL]、[ELL]、[ELL]、[ELLO]、[ELO]、[EO]、[H]、[HE]、[HELL]、[HELLO]、[HELLO]、[HELLO]、[HELLO]、[HELLO]、[HELLO],
‘HEO’、‘HL’、‘HLL’、‘HLLO’、‘HLO’、‘HO’、‘L’、‘LL’、‘LLO’、‘LO’、‘O’]
>>>所有子序列(“世界”)
[D]、[L]、[LD]、[O]、[OD]、[OL]、[OLD]、[OR]、[ORD]、[ORL]、[ORL]、[ORL]、[ORD]、[R]、[RD],
‘RL’、‘RLD’、‘W’、‘WD’、‘WL’、‘WLD’、‘WOD’、‘WOL’、‘WOD’、‘WOR’、‘WOR’、‘WOD’、‘WOR’、‘WORD’、‘WOD’、‘WOR’、‘WOD’、‘WO,
‘世界’、‘世界’、‘世界’、‘世界’、‘世界’、‘世界’、‘世界’、‘世界’、‘世界’、‘世界’、‘世界’、‘世界’

不清楚您到底想要什么。你能给一个简短的单词举个具体的例子吗?如果你想要子序列,为什么要使用带替换的组合而不是组合?22不是0123的子序列。此外,如果您仅将其用于成员资格测试,请使用集合,而不是列表。集合成员资格测试是O(1)次。这不都是子字符串吗@kaya3--同意。但是,上面的代码生成的是子字符串而不是子序列(至少在我尝试时是这样)。例如,对于sring“cab”,结果是c,ca,cab,a,ab,b@DarrylG是的,我误解了你的评论-我道歉。是的,你是对的,这个答案产生子字符串就像OP的代码一样;唯一的区别是避免重复。@kaya3--没问题。我喜欢你的答案。