在Python中获取字符串及其子字符串的所有组合

时间:2018-07-26 11:51:46

标签: python string

关于获取所有可能的子字符串(即相邻的字符集),我已经看到很多问题,但是对于生成所有可能的字符串(包括其子字符串的组合)都没有疑问。

例如,让:

x = 'abc'

我希望输出为:

['abc', 'ab', 'ac', 'bc', 'a', 'b', 'c']

主要要点是,我们可以删除原始字符串中不相邻的多个字符(以及相邻的字符)。

这是我到目前为止尝试过的:

def return_substrings(input_string):
    length = len(input_string)
    return [input_string[i:j + 1] for i in range(length) for j in range(i, length)]

print(return_substrings('abc'))

但是,这只会从原始字符串中删除多组相邻的字符串,而不会返回上例中的元素'ac'

另一个示例是,如果我们使用字符串'abcde',则输出列表应包含元素'ace''bd'等。

4 个答案:

答案 0 :(得分:13)

您可以使用itertools.combinations

轻松完成此操作
if (isset($_GET['id']))

如果您希望按相反的顺序进行操作,可以使>>> from itertools import combinations >>> x = 'abc' >>> [''.join(l) for i in range(len(x)) for l in combinations(x, i+1)] ['a', 'b', 'c', 'ab', 'ac', 'bc', 'abc'] 函数以相反的顺序返回其顺序

range

答案 1 :(得分:4)

这是一个有趣的练习。我认为其他答案可以使用itertools.product或itertools.combinations。但是,只是为了好玩,您也可以使用类似的递归方法

    public ActionResult RMA(int? id, VMRMA model , int? pageNumber)
    {

        //List comments
          IPagedList<VMRMA.Comment_List> queryTwo = (from RH in db.RMA_History

                       join RB in db.Besked on RH.Id equals RB.RMAID

                       where RB.RMAID == id 

                       select new VMRMA.Comment_List
                       {
                           //Select Something

                       }).ToPagedList(pageNumber ?? 1, 3);


          var query = (from RH in db.RMA_History
                       join RS in db.RMAStatus on RH.StatusID equals RS.ID


                      where RH.Id == id


                       select new VMRMA.HRMA
                       {
                           //Select Something

                       });

        model.HRMAs = query.FirstOrDefault();
        model.Comment_Lists = queryTwo.ToList();

        return View(model);
   }

答案 2 :(得分:1)

@Sunitha answer提供了正确的使用工具。我将在使用return_substrings方法的同时建议一种改进的方法。基本上,我的解决方案将处理重复项


我将使用"ABCA"来证明我的解决方案的有效性。请注意,它将在接受的答案的返回列表中包含重复的'A'

Python 3.7+解决方案

x= "ABCA"
def return_substrings(x):
    all_combnations = [''.join(l) for i in range(len(x)) for l in combinations(x, i+1)]
    return list(reversed(list(dict.fromkeys(all_combnations))))
    # return list(dict.fromkeys(all_combnations)) for none-reversed ordering

print(return_substrings(x))
>>>>['ABCA', 'BCA', 'ACA', 'ABA', 'ABC', 'CA', 'BA', 'BC', 'AA', 'AC', 'AB', 'C', 'B', 'A']

Python 2.7解决方案

您将必须使用OrderedDict而不是普通的dict。因此,

 return list(reversed(list(dict.fromkeys(all_combnations))))

成为

return list(reversed(list(OrderedDict.fromkeys(all_combnations))))

订单与您无关?

如果顺序不相关,则可以降低代码复杂度,

x= "ABCA"
def return_substrings(x):
    all_combnations = [''.join(l) for i in range(len(x)) for l in combinations(x, i+1)]
    return list(set(all_combnations))

答案 3 :(得分:0)

def return_substrings(s):
    all_sub = set()
    recent = {s}

    while recent:
        tmp = set()
        for word in recent:
            for i in range(len(word)):
                tmp.add(word[:i] + word[i + 1:])
        all_sub.update(recent)
        recent = tmp

    return all_sub