8位数的可能排列是什么

时间:2015-01-02 05:55:17

标签: python permutation

我需要知道遵循python代码规则的8位数的可能排列:

import itertools
import time
import string

numbers = set(range(10))
letters = set(string.ascii_letters)
mylist=[]
start=time.time()

comb = ([x for x in itertools.combinations([0,1,2,3,4,5,6,7,8,9,'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'], 8)
       if set(x) & letters and set(x) & numbers])

f=open("data.txt","w")
f.write("%s" % comb)
f.close()

end=time.time()
diff=end-start

print ("Se obtuvieron {} combinaciones.".format(len(comb)))
print ("En un tiempo total de:",diff,"segundos")

2 个答案:

答案 0 :(得分:2)

他们中有很多人。要明确:

  • 两位数的123的组合是12,13,23。
  • 对于2位数的123的排列是12,13,21,23,31,32。

组合是一个较小的数字,因为顺序并不重要。您的代码看起来需要至少一个8位数组合中的数字或字母,因此您需要总和:

  • 7个字母的1位数组合组合。
  • 2位数的组合乘以6个字母的组合 等...
  • 7位数的组合乘以1个字母的组合。

排列应该是62个字母/数字,每次8个,减去一次8个字母的52个字母的全字母排列,减去一次8个数字的所有数字排列。

from math import factorial as f

def P(n,k):
    return f(n)//f(n-k)

def C(n,k):
    return f(n)//f(n-k)//f(k)

letters = 52
numbers = 10
length = 8
combinations = sum(C(numbers,i) * C(letters,length-i) for i in range(1,length))
print('Combinations: {:20,}'.format(combinations))

permutations = P(letters+numbers,length) - P(letters,length) - P(numbers,length)
print('Permutations: {:20,}'.format(permutations))

输出:

Combinations:        2,628,560,350
Permutations:  105,983,553,312,000

尝试在代码执行时在内存列表中生成所有这些组合或排列并不是一个好主意。

答案 1 :(得分:1)

为了记录,我认为你没有问正确的问题。你说排列,但你的代码使用组合,那些是不同的东西。

我不会给你完整的答案,因为计算它会花费很长时间。从视角来看这个数字有多大。 0~9的8个数字的排列为: 1.814.400

从:(0,1,2,3,4,5,6,7)开始,以(9,8,7,6,5,4,3,2)结尾

你可以使用这个来演示所有ASCII字母中8个数字的排列数,其中0到9的数字是:

mylist = range(10)
mylist.extend(ascii_letters)
i = 0
for n in permutations(mylist,8):
    i += 1

但这将花费很长时间,只是为了显示这个数字有多大:

我跑了几分钟,它超过了1.500.000.000。(15亿)

此外,您的代码没有多大意义。你为什么要计算这么大的数字呢?为什么需要将其写入文件(可能需要永久/耗尽内存和/或空间)。尝试详细说明你想要的东西。