如何使用递归获取满足特定要求的列表列表?

时间:2015-03-05 00:26:10

标签: python list recursion permutation

我有一个单词列表,它是字符串的子集

例如,如果字符串是'abb'

列表将是

[ '一个', 'AB', 'B']

我想创建一个列出原始字符串的列表。因此,列表列表中的一个列表字母数必须与字符串

中的字母数完全相等

所以对于给定的例子,一个是 ['b','ab']

有一个帮助函数可以跟踪每个字符串中的字母,因此字母可以被视为数字,可以直接添加,如'b'+'ab'=='abb' 将被视为 True

我是递归的新手,我想不出创建这个功能的方法,请帮忙。

完整示例:

string = 'office key'
lst_of_possibilities = ['icky', 'fee', 'coy', 'key', 'ice', 'office', 'fief', 'icy', 'iffy', 'eye', 'foe', 'eke', 'yoke', 'coffee', 'coke', 'off', 'foci', 'fife']

并在函数结束后输出为:

[['eke', 'icy', 'off'], ['eke', 'off', 'icy'], ['ice', 'key', 'off'], ['ice', 'off', 'key'], ['icy', 'eke', 'off'], ['icy', 'off', 'eke'], ['key', 'ice', 'off'], ['key', 'off', 'ice'], ['key', 'office'], ['off', 'eke', 'icy'], ['off', 'ice', 'key'], ['off', 'icy', 'eke'], ['off', 'key', 'ice'], ['office', 'key']] 

所以我想说的是,上面列表中的每个列表都会加上“office key”这个词

1 个答案:

答案 0 :(得分:0)

最愚蠢的方法可能是: 让字符串为 s ,单词列表为 p

s = "office key"
p = ['icky', 'fee', 'coy', 'key', 'ice', 'office', 'fief', 'icy', 'iffy', 'eye', 'foe', 'eke', 'yoke', 'coffee', 'coke', 'off', 'foci', 'fife']
res_list = []
s = "".join(s.split())
n = len(p)
for mask in range(2**n):
    str = ""
    cur_list = []
    for i in range(n):
        if mask & (2**i) > 0:
             str += p[i]
             cur_list.append(p[i])
             if len(str) > len(s):
                 break
             bad = 0
             for ch in p[i]:
                if ch not in s:
                    bad = 1
                    break
             if bad == 1:
                break
    ok = 1
    for ch in s:
        if ch == " ":
            continue
        pos = str.find(ch)
        if pos == -1:
            ok = 0
            break
        else:
            str = str[:pos] + str[(pos+1):]
    if len(str) > 0:
        ok = 0
    if ok == 1:
        res_list.append(cur_list)

print res_list

这是一个稍微优化的强力搜索,我认为对您来说特定的问题是正确的,因为您需要所有可能的解决方案列表。

P.S。您可以获得每个特定输出的所有排列,只需在最后输出res_list中每个列表的所有排列,就可以更快地实现这些排列