8位数字的可能排列是什么
what are the possible permutations of 8 digits
我需要知道遵循我的 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位123的组合是12、13、23。
- 123 的 2 个数字的排列是 12, 13, 21, 23, 31, 32。
组合是一个较小的数字,因为顺序无关紧要。您的代码看起来在您的 8 位数字组合中至少需要一个数字或字母,因此您需要总和:
- 1 位数字乘以 7 个字母的组合。
- 2 位数字乘以 6 个字母的组合。
等...
- 7 位数字乘以 1 个字母的组合。
排列应该是62 letters/numbers一次取8个,减去52个字母一次取8个的全字母排列,减去一次取8个10个数字的全数排列。
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
像您的代码那样尝试在内存列表中生成所有这些组合或排列不是一个好主意。
郑重声明,我认为您问的问题不对。你说排列,但你的代码使用组合,那是不同的东西。
我不会给你完整的答案,因为计算它需要很长时间。确切地说,这个数字有多大。 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 亿)
此外,您的代码没有多大意义。为什么你需要计算这么大的数字?为什么需要将它写入文件(它可能会占用 forever/run 内存 and/or space)。试着详细说明你想要什么。
我需要知道遵循我的 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位123的组合是12、13、23。
- 123 的 2 个数字的排列是 12, 13, 21, 23, 31, 32。
组合是一个较小的数字,因为顺序无关紧要。您的代码看起来在您的 8 位数字组合中至少需要一个数字或字母,因此您需要总和:
- 1 位数字乘以 7 个字母的组合。
- 2 位数字乘以 6 个字母的组合。
等... - 7 位数字乘以 1 个字母的组合。
排列应该是62 letters/numbers一次取8个,减去52个字母一次取8个的全字母排列,减去一次取8个10个数字的全数排列。
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
像您的代码那样尝试在内存列表中生成所有这些组合或排列不是一个好主意。
郑重声明,我认为您问的问题不对。你说排列,但你的代码使用组合,那是不同的东西。
我不会给你完整的答案,因为计算它需要很长时间。确切地说,这个数字有多大。 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 亿)
此外,您的代码没有多大意义。为什么你需要计算这么大的数字?为什么需要将它写入文件(它可能会占用 forever/run 内存 and/or space)。试着详细说明你想要什么。