大佬教程收集整理的这篇文章主要介绍了如何找到所有可能的方法将字符串划分为 n 个切片而无需递归?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要编写一个函数来接收一个字符串和组的数量,然后返回所有可能的切片选项。
即对于func('Hello',3)
:
[['h','e','llo'],['h','el','lo'],'ell','o'],['he','ll','l',['Hel','o']]
如何在不使用递归的情况下做到这一点?这应该只能使用循环和列表才能实现。
这类似于“将球分成垃圾箱”的问题,但在本例中有所不同,因为对象的顺序永远不会改变,只是切片。
这是我目前拥有的代码:
def divIDe_into_two(word):
List_of_divs = []
for i in range(1,len(word)):
List_of_divs.append([word[0:i],word[i:len(word)]])
return List_of_divs
它只将一个词分成两组。我想我们需要某种内部循环来继续划分它,以防它有更多的组,但我不知道该怎么做。
使用 itertools.combinations
来选择切割字符串的位置的索引:
from itertools import combinations
def func(s,n):
return [[s[i:j] for i,j in zip([None,*cuts],[*cuts,None])]
for cuts in combinations(range(1,len(s)),n-1)]
func('Hello',3)
的结果:
[['h','e','llo'],['h','el','lo'],'ell','o'],['he','l','ll',['Hel','o']]
另一种解决方案,从所有单片分割(即,仅整个字符串)开始,然后计算两片分割,然后是三片分割等。通过始终将最后一个切片一分为二来完成允许所需的剩余分割数的方法:
def func(s,n):
divs = [[s]]
for i in range(n-1):
divs = [[*keep,last[:j],last[j:]]
for *keep,last in divs
for j in range(1,len(last)-n+i+2)]
return divs
,
您可以使用 more itertools。
from more_itertools import partitions
def divide_into_parts(word,parts):
result = []
for p in partitions(word):
if len(p) == parts:
result.append([''.join(s) for s in p])
return result
结果
divide_into_parts('Hello',3)
[['h','o']]
,
这是一个可能的解决方案:
from itertools import combinations
def slicings(s,g):
for c in combinations(range(1,g - 1):
yield [s[start:end] for start,end in zip((0,) + c,c + (len(s),))]
你现在可以用你的切片生成器做任何你想做的事情:
for slicing in slicings('Hello',3):
print(slicing)
['h','llo']
['h','lo']
['h','o']
['he','lo']
['he','o']
['Hel','o']
在这些情况下,最好根据需要生成内容(使用 yield
而不是 return
),因为根据您的具体情况,结果可能呈指数级增长。
以上是大佬教程为你收集整理的如何找到所有可能的方法将字符串划分为 n 个切片而无需递归?全部内容,希望文章能够帮你解决如何找到所有可能的方法将字符串划分为 n 个切片而无需递归?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。