2014-04-08 97 views
3

我有一個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個。

謝謝!

+0

從數學上講,您尋找*排列*,而不是*組合*。項目組合中的項目組合是獨特元素的無序集合(無重複項目)。 –

回答

1

一個可以解決這個問題至少有3種方法。

  1. 使用嵌套循環
  2. 使用list comprehensions
  3. 使用itertools.product()

讓我們來看看如何使用這些並深入到這些的時候表現:

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/。性能可能不盡相同