多个排列,包括重复

时间:2014-04-08 01:57:06

标签: python list duplicates permutation

我有一个包含6个元素L = ['a', 'b', 'c', 'd', 'e', 'f']的列表,并希望生成所有可能的4个字母组合 - 包含重复值

['a', 'b', 'c', 'd']以及['a', 'a', 'a', 'a']['a', 'a', 'b', 'b']等。

到目前为止,我一直在使用import itertools: p = list(itertools.permutations(L, 4))。 (Python 2.7.6)

然而,这只给了我360个独特的组合,而不是我想要的1296。

谢谢!

2 个答案:

答案 0 :(得分:10)

这是4个副本列表的笛卡尔积。你想要itertools.product

import itertools
itertools.product(L, repeat=4)

答案 1 :(得分:1)

至少可以通过3种方式解决这个问题。

  1. 使用嵌套循环
  2. 使用list comprehensions
  3. 使用itertools.product()
  4. 让我们看看如何使用这些并深入了解这些内容的时间性能:

    from time import time
    
    # Solution 1
    time_start = time()
    L = ['a', 'b', 'c', 'd', 'e', 'f']
    ar = []
    for a in L:
        for b in L:
            for c in L:
                for d in L:
                    ar.append([a,b,c,d])
    print(len(ar))
    time_end = time()
    print('Nested Iterations took %f seconds' %(time_end-time_start))
    
    
    # Solution 2
    time_start = time()
    L = ['a', 'b', 'c', 'd', 'e', 'f']
    ar = [[a,b,c,d] for a in L for b in L for c in L for d in L]
    print(len(ar))
    time_end = time()
    print('List Comprehension took %f seconds' %(time_end-time_start))
    
    
    # Solution 3
    import itertools
    time_start = time()
    L = ['a', 'b', 'c', 'd', 'e', 'f']
    ar = list(itertools.product(L, repeat = 4))
    print(len(ar))
    time_end = time()
    print('itertools.product took %f seconds' %(time_end-time_start))
    

    输出:

    1296
    Nested Iterations took 0.001148 seconds
    1296
    List Comprehension took 0.000299 seconds
    1296
    itertools.product took 0.000227 seconds
    

    因此,比较我们看到itertools.product()的方式比其他方式更简单有效。

    N.B。:代码在https://codepad.remoteinterview.io/中运行。表现可能会有所不同。