组合中没有Python中所有元素的重复项

时间:2018-06-30 03:05:56

标签: python python-3.x algorithm

要弄清楚图片,如果我有一个字符串:

'pac'

在此示例中,我想获取每个排列的列表:

['p', 'a', 'c', 'pa', 'pc', 'pac']

就像我会在某个搜索引擎(例如Ebay上的搜索引擎)中键入任何一个一样,它会弹出“ pac”作为建议。

代码波纹管是我到目前为止所取得的成就,但是显然它并没有达到预期的效果。 “名称”只是具有多个名称的列表,例如:['pac','greg','witch']

    letters = {}
    for name in names:
        temp = []
        letter = []
        temp2 = []

        for let in name:
            let = let.lower()
            temp.append(let)
            letter.append(let)

        for i in range(0, len(name)):
            for j in range(1, len(name) - i):
                print(i, j, end='  ')

                to_add = letter[i] + temp[j]
                print(to_add, temp2)

                temp2.append(to_add)
                letter.append(to_add)
            temp = temp2
            temp2 = []

        letters[name] = letter
    return letters

如果有内置功能,可以随时与我分享,但这不是问题的核心。

1 个答案:

答案 0 :(得分:3)

用户标准库itertools

In [48]: T = 'pac'

In [49]: list(itertools.chain(*[itertools.combinations(T, i+1) for i in range(len(T))]))
Out[49]: [('p',), ('a',), ('c',), ('p', 'a'), ('p', 'c'), ('a', 'c'), ('p', 'a', 'c')]

它分为:

1,itertools.combinations(['p', 'a', 'c'], i)生成样本大小为i的所有'pac'子样本

2,对i重复i=1, 2, 3,然后将所得的三个itertools.combination对象放入列表中

3,从#2解压缩列表,然后将其用作参数以生成itertools.chain对象(顾名思义,它将其args链接在一起)。进一步了解参数unpack

在许多实际的用例中,尤其是当元素总数很大时,您实际上并不想从itertools.chain对象中列出。使用itertools的目的通常是通过避免将其所有成员都放在内存中来提高内存效率。

(如果您不希望tuple,只需添加一个''.join即可将其恢复为字符串)