jum*_*pap 13 python integer permutation python-itertools
我可以得到这样的整数排列:
myInt = 123456789
l = itertools.permutations(str(myInt))
[int(''.join(x)) for x in l]
Run Code Online (Sandbox Code Playgroud)
有没有更有效的方法在Python中获取整数排列,省去了创建字符串的开销,然后加入生成的元组?对它进行定时,元组连接过程使这个时间长3倍 list(l)
.
增加了支持信息
myInt =123456789
def v1(i): #timeit gives 258ms
l = itertools.permutations(str(i))
return [int(''.join(x)) for x in l]
def v2(i): #timeit gives 48ms
l = itertools.permutations(str(i))
return list(l)
def v3(i): #timeit gives 106 ms
l = itertools.permutations(str(i))
return [''.join(x) for x in l]
Run Code Online (Sandbox Code Playgroud)
你可以做:
>>> digits = [int(x) for x in str(123)]
>>> n_digits = len(digits)
>>> n_power = n_digits - 1
>>> permutations = itertools.permutations(digits)
>>> [sum(v * (10**(n_power - i)) for i, v in enumerate(item)) for item in permutations]
[123, 132, 213, 231, 312, 321]
Run Code Online (Sandbox Code Playgroud)
这避免了转换到元组和从元组转换,因为它将使用元组中的整数位置来计算其值(例如,(1,2,3)
均值100 + 20 + 3
).
因为n_digits
整个过程中的值已知且相同,我认为您还可以优化计算:
>>> values = [v * (10**(n_power - i)) for i, v in enumerate(itertools.repeat(1, n_digits))]
>>> values
[100, 10, 1]
>>> [sum(v * index for v, index in zip(item, values)) for item in permutations]
[123, 132, 213, 231, 312, 321]
Run Code Online (Sandbox Code Playgroud)
我也认为我们不需要一直打电话zip()
,因为我们不需要那个列表:
>>> positions = list(xrange(n_digits))
>>> [sum(item[x] * values[x] for x in positions) for item in permutations]
[123, 132, 213, 231, 312, 321]
Run Code Online (Sandbox Code Playgroud)
这将为您提供一个生成器:
import itertools as it
gen = it.permutations(range(1, 10))
Run Code Online (Sandbox Code Playgroud)
然后你可以迭代每个项目:
for i in gen:
#some code
Run Code Online (Sandbox Code Playgroud)
或者将其转换为列表,但这需要一些时间:
items = list(gen)
Run Code Online (Sandbox Code Playgroud)
编辑:澄清你想要返回一个整数,也许最快的方法是使用另一个惰性评估:
gen = (int('%d%d%d%d%d%d%d%d%d' % x) for x in it.permutations(range(1, 10)))
Run Code Online (Sandbox Code Playgroud)