Python 列出给定字符可能性中的所有可能字符串

Python 列出给定字符可能性中的所有可能字符串,python,python-2.7,recursion,Python,Python 2.7,Recursion,对于递归来说,也许现在还为时过早,但我在为它找到正确的算法方面遇到了太多的困难 我有这样一个字符串:abcd 除了我不能完全确定它所有的字母。有可能a实际上应该是a,甚至可能是@。d可以是d,也可以是d,甚至可以是+。因此,我提出了以下建议: possibilities = [['a', 'A', '@'], 'bc', ['d', 'D', '+']] 我想列出所有可能的单词: output = [ 'abcd', 'Abcd', '@bcd', 'abcD'

对于递归来说,也许现在还为时过早,但我在为它找到正确的算法方面遇到了太多的困难

我有这样一个字符串:
abcd

除了我不能完全确定它所有的字母。有可能
a
实际上应该是
a
,甚至可能是
@
d
可以是
d
,也可以是
d
,甚至可以是
+
。因此,我提出了以下建议:

possibilities = [['a', 'A', '@'], 'bc', ['d', 'D', '+']]
我想列出所有可能的单词:

output = [
    'abcd',
    'Abcd',
    '@bcd',
    'abcD',
    # etc.
]
这张单子的顺序对我来说无关紧要

我看了一下,但一眼就发现,我找不到一个适合我的函数,所以我决定实现一个递归解决方案

def find_possible_strings(possibilities):
  res = []
  f2(possibilities, '', res)
  return res

def f2(possibilities, s, final_result):
  for i,elem in enumerate(possibilities):
    if type(elem) == str:
      s += elem
    else:
      for e in elem:
        f2(possibilities[i+1:], s + e, final_result)

  final_result.append(s)

possibilities = [['a', 'A', '@'], 'bc', ['d', 'D', '+']]
print '\n'.join(find_possible_strings(possibilities))
现在,它打印:

abcd
abcD
abc+
abc
Abcd
AbcD
Abc+
Abc
@bcd
@bcD
@bc+
@bc
bcd
bcD
bc+
bc
我相信我得到了我想要的所有可能的字符串,但也得到了一堆不完整的字符串。我认为问题在于我没有添加到
else
块中的
s
,因此我在函数末尾附加的
s
是不完整的

除非像
if len(s)!=4:返回
在函数末尾,如何修复此函数

如果另一个更合适,您可以更改输入和输出数据结构。当然,你可以用一个库调用来替换我的函数,如果这样做可以使事情变得更简单的话


同时,我将对此进行更多的修补。

这不是一个递归形状的问题,所以放下锤子

您正在生成4个可能性列表的笛卡尔乘积,每个位置一个。使用
itertools.product()
(并给出每个职位自己的列表),您就完成了:

from itertools import product

possibilities = [['a', 'A', '@'], ['b'], ['c'], ['d', 'D', '+']]

for combo in product(*possibilities):
    print(''.join(combo))
演示:


这不是一个递归式的问题,所以放下那把锤子

您正在生成4个可能性列表的笛卡尔乘积,每个位置一个。使用
itertools.product()
(并给出每个职位自己的列表),您就完成了:

from itertools import product

possibilities = [['a', 'A', '@'], ['b'], ['c'], ['d', 'D', '+']]

for combo in product(*possibilities):
    print(''.join(combo))
演示:


这可能不是您在这里想要的,但您描述的是一种非常简单的正则语言,可以很容易地编码为一个简单的正则表达式,如
[aA@]bc[dD+]
。当然,re库不允许您生成模式可以匹配的所有字符串(由于扩展正则表达式模式的全部复杂性,您永远不会希望这样做),但是一个不重复地扩展基本正则表达式的程序非常容易编写,并且可能对尝试编写有指导意义,如果您确实希望递归地执行此操作,那么只需向上传递部分字符串将比向下在累加器中构建字符串更简单。大多数递归问题都是这样。了解如何编写累积尾部递归是值得的(特别是如果您想使用其他进行尾部调用消除、鼓励尾部递归而不是循环的语言),但通常还是值得先编写和测试更简单的方法。而且,在Python中,通常值得停在这里,因为没有TCE,尾部递归没有真正的好处。这可能不是您想要的,但您描述的是一种非常简单的正则语言,可以轻松地编码为一个简单的正则表达式,如
[aA@]bc[dD+]
。当然,re库不允许您生成模式可以匹配的所有字符串(由于扩展正则表达式模式的全部复杂性,您永远不会希望这样做),但是一个不重复地扩展基本正则表达式的程序非常容易编写,并且可能对尝试编写有指导意义,如果您确实希望递归地执行此操作,那么只需向上传递部分字符串将比向下在累加器中构建字符串更简单。大多数递归问题都是这样。了解如何编写累积尾部递归是值得的(特别是如果您想使用其他进行尾部调用消除、鼓励尾部递归而不是循环的语言),但通常还是值得先编写和测试更简单的方法。而且,在Python中,通常值得停在这里,因为没有TCE,尾部递归就没有真正的好处。