我有一个元组列表,例如:
A=[(1,2,3), (3,5,7,9), (7)]
Run Code Online (Sandbox Code Playgroud)
并希望从每个元组中生成一个项目的所有排列.
1,3,7
1,5,7
1,7,7
...
3,9,7
Run Code Online (Sandbox Code Playgroud)
我可以有任意数量的元组,元组可以有任意数量的元素.我不能使用itertools.product()因为python 2.5.
Sil*_*ost 13
docs itertools.product有一个如何在py2.5中实现它的例子:
def product(*args, **kwds):
# product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy
# product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111
pools = map(tuple, args) * kwds.get('repeat', 1)
result = [[]]
for pool in pools:
result = [x+[y] for x in result for y in pool]
for prod in result:
yield tuple(prod)
Run Code Online (Sandbox Code Playgroud)
小智 7
def product(*iterables):
""" Equivalent of itertools.product for versions < 2.6,
which does NOT build intermediate results.
Omitted 'repeat' option.
product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy
"""
nIters = len(iterables)
lstLenths = []
lstRemaining = [1]
for i in xrange(nIters-1,-1,-1):
m = len(iterables[i])
lstLenths.insert(0, m)
lstRemaining.insert(0, m * lstRemaining[0])
nProducts = lstRemaining.pop(0)
for p in xrange(nProducts):
lstVals = []
for i in xrange(nIters):
j = p/lstRemaining[i]%lstLenths[i]
lstVals.append(iterables[i][j])
yield tuple(lstVals)
Run Code Online (Sandbox Code Playgroud)
在使用生成器时,我也发现了一个版本itertools.product,它几乎与(本机)库版本一样快,同时 100% 兼容它,并且它不会构建中间结果:
def product(*args, **kwds):
"Alternative fast implementation of product for python < 2.6"
def cycle(values, uplevel):
for prefix in uplevel: # cycle through all upper levels
for current in values: # restart iteration of current level
yield prefix + (current,)
stack = iter(((),))
for level in tuple(map(tuple, args)) * kwds.get('repeat', 1):
stack = cycle(level, stack) # build stack of iterators
return stack
Run Code Online (Sandbox Code Playgroud)
使用 python 2.7.3,我发现性能非常好(通常只有大约 5-10 倍慢,内存使用基本相同)。
>>> import itertools as itt
>>> timeit for _ in itt.product(range(20), range(3), range(150)): pass
1000 loops, best of 3: 221 µs per loop
>>> timeit for _ in product(range(20), range(3), range(150)): pass
1000 loops, best of 3: 1.14 ms per loop
Run Code Online (Sandbox Code Playgroud)
编辑:使代码更简单并且支持 Python 3。
| 归档时间: |
|
| 查看次数: |
4679 次 |
| 最近记录: |