关于获取所有可能的子字符串(即相邻的字符集),我已经看到很多问题,但是对于生成所有可能的字符串(包括其子字符串的组合)都没有疑问。
例如,让:
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'
等。
答案 0 :(得分:13)
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