查找指定字符长度内的所有字符串组合

时间:2021-06-14 19:05:44

标签: python

我有一个字符串列表,例如:['Lion','Rabbit','Sea Otter','Monkey','Eagle','Rat']

我试图找出这些项目的可能组合总数,其中项目顺序很重要,以及当所有字符串用逗号分隔符连接时的总字符串长度小于给定长度。

因此,对于最大总字符串长度 14,我需要计算诸如(并非详尽列表)之类的组合:

  • 狮子
  • 兔子
  • 鹰,狮子
  • 狮子,鹰
  • 狮子、鹰、老鼠
  • 鹰、狮子、老鼠
  • 海獭、狮子
  • 等等...

但不包括总字符串长度超过 14 个字符限制的组合,例如 Sea Otter,Monkey

我知道对于这个非常有限的示例,使用几个嵌套循环手动计算或确定并不难,但实际用例将是几百个字符串的列表和更长的字符限制,这意味着手动编写的嵌套迭代次数会非常混乱......

我尝试通过 Python 的 itertools 来完成编写此代码,但一直迷失方向,因为我发现的所有示例都没有足够接近我需要的内容,尤其是在字符长度有限的情况下(不是 em> 数量有限)以及允许以不同顺序重复组合的需要。

任何入门帮助都会很棒。

2 个答案:

答案 0 :(得分:2)

您可以在创建最多 3 个项目的列表的列表推导式中使用 itertools.combinations(每个定义的更多项目将超过 14 个字符的组合),同时按总字符串长度进行过滤:

import itertools

lst = ['Lion','Rabbit','Sea Otter','Monkey','Eagle','Rat']
sorted_lst = sorted(lst, key=len)

#find max number of items
for n, i in enumerate(sorted_lst):
    if len(','.join(sorted_lst[:n+1])) > 14:
        items_limit = n+1
        break

[x for l in range(1, items_limit) for x in itertools.combinations(lst, l) if len(','.join(x))<15]

附注。如果您需要排列(如在您的示例输出中),请使用 itertools.permutations,您的问题是关于组合。

答案 1 :(得分:1)

您可以使用递归生成器函数:

s, m_s = ['Lion','Rabbit','Sea Otter','Monkey','Eagle','Rat'], 14
def get_combos(d, c = []):
   yield ','.join(c) #yield back valid combination
   for i in range(len(d)):
       if d[i] not in c and len(','.join(c+[d[i]])) <= m_s:
          yield from get_combos(d[:i]+d[i+1:], c+[d[i]]) #found a new valid combination
       if len(d[i]) <= m_s:
          yield from get_combos(d[:i]+d[i+1:], [d[i]]) #ignore running combo and replace with new single string
       yield from get_combos(d[:i]+d[i+1:], c) #ignore string at current iteration of `for` loop and keep the running combination

_, *vals = set(get_combos(s))
print(vals)

输出:

['Rat,Rabbit', 'Lion,Rabbit', 'Eagle', 'Eagle,Lion,Rat', 'Monkey', 'Rabbit,Lion', 'Rat,Eagle', 'Sea Otter', 'Rat,Lion,Eagle', 'Monkey,Rat', 'Rabbit,Monkey', 'Sea Otter,Rat', 'Rabbit', 'Lion,Sea Otter', 'Rabbit,Eagle', 'Rat,Eagle,Lion', 'Rat,Sea Otter', 'Lion,Monkey', 'Eagle,Lion', 'Eagle,Rat', 'Lion,Eagle,Rat', 'Rat', 'Lion,Rat,Eagle', 'Eagle,Rabbit', 'Rat,Lion', 'Monkey,Eagle', 'Lion,Eagle', 'Eagle,Monkey', 'Monkey,Lion', 'Rat,Monkey', 'Sea Otter,Lion', 'Rabbit,Rat', 'Monkey,Rabbit', 'Eagle,Rat,Lion', 'Lion,Rat', 'Lion']