Python 在给定字符集的情况下,如何得到第n个置换,反之亦然
如果您有此字符集:Python 在给定字符集的情况下,如何得到第n个置换,反之亦然,python,algorithm,permutation,itertools,Python,Algorithm,Permutation,Itertools,如果您有此字符集: abc 排列将是 0 = a 1 = b 2 = c 3 = aa 4 = ab 5 = ac 6 = ba 7 = bb 8 = bc 9 = ca 10 = cb 11 = cc 等等等等。python中有没有一种方法可以获取n(一个表示它是哪种排列的数字)并返回相应的字符串?有没有办法做相反的事情 例如: get_word(10, "abc") #returns cb get_n("cb", "abc") #returns 10 可能有更有效的方法来实现这一点,
abc
排列将是
0 = a
1 = b
2 = c
3 = aa
4 = ab
5 = ac
6 = ba
7 = bb
8 = bc
9 = ca
10 = cb
11 = cc
等等等等。python中有没有一种方法可以获取n(一个表示它是哪种排列的数字)并返回相应的字符串?有没有办法做相反的事情
例如:
get_word(10, "abc")
#returns cb
get_n("cb", "abc")
#returns 10
可能有更有效的方法来实现这一点,但这些函数可以满足您的需要。使用固定长度的字符串进行转换非常容易;为了处理这些可变长度的字符串,我们只需要合并一个偏移量,该偏移量可以解释比当前长度短的所有字符串。对于正向转换,我们可以很容易地做到这一点;对于反向转换,可以方便地使用标准公式
可能有更有效的方法来实现这一点,但这些函数可以满足您的需要。使用固定长度的字符串进行转换非常容易;为了处理这些可变长度的字符串,我们只需要合并一个偏移量,该偏移量可以解释比当前长度短的所有字符串。对于正向转换,我们可以很容易地做到这一点;对于反向转换,可以方便地使用标准公式
这只是数学。e、 g:在你的例子中有3个单字母字符串,3*3个双字母字符串,3*3*3个三字母字符串等等。我理解你说的是什么,但编程起来更困难。没有内置函数可以有效地完成这项工作,但它们可以直接实现。这些东西既不是置换,也不是重复置换。也许,如果你能找到如何将n的“thing”表示为10个字符的字母表“0123456789”,你可能会找到一个合适的名称和算法。@dercz:“这是一个非常机智的提示”-我想你误解了这些排列的本质。。。试一下,自己看看,这只是数学。e、 g:在你的例子中有3个单字母字符串,3*3个双字母字符串,3*3*3个三字母字符串等等。我理解你说的是什么,但编程起来更困难。没有内置函数可以有效地完成这项工作,但它们可以直接实现。这些东西既不是置换,也不是重复置换。也许,如果你能找到如何将n的“thing”表示为10个字符的字母表“0123456789”,你可能会找到一个合适的名称和算法。@dercz:“这是一个非常机智的提示”-我想你误解了这些排列的本质。。。尝试一下这项任务,自己看看。
def gpsum(base, terms):
return (base ** (terms + 1) - 1) // (base - 1)
def ntos(n, bstring):
m = base = len(bstring)
length = 1
while m <= n:
n -= m
m *= base
length += 1
s = []
for i in range(length):
n, d = divmod(n, base)
s.append(bstring[d])
return ''.join(s)[::-1]
def ston(s, digits):
base = len(digits)
n = 0
for c in s:
n *= base
n += digits[c]
return n + gpsum(base, len(s) - 1) - 1
# Test
bstring = 'abc'
digits = {c:i for i,c in enumerate(bstring)}
maxchars = 4
for i in range(gpsum(len(bstring), maxchars) - 1):
s = ntos(i, bstring)
j = ston(s, digits)
print('{0:>3} {1:>{3}} {2:>3}'.format(i, s, j, maxchars))
0 a 0
1 b 1
2 c 2
3 aa 3
4 ab 4
5 ac 5
6 ba 6
7 bb 7
8 bc 8
9 ca 9
10 cb 10
11 cc 11
12 aaa 12
13 aab 13
14 aac 14
15 aba 15
16 abb 16
17 abc 17
18 aca 18
19 acb 19
20 acc 20
21 baa 21
22 bab 22
23 bac 23
24 bba 24
25 bbb 25
26 bbc 26
27 bca 27
28 bcb 28
29 bcc 29
30 caa 30
31 cab 31
32 cac 32
33 cba 33
34 cbb 34
35 cbc 35
36 cca 36
37 ccb 37
38 ccc 38
39 aaaa 39
40 aaab 40
41 aaac 41
42 aaba 42
43 aabb 43
44 aabc 44
45 aaca 45
46 aacb 46
47 aacc 47
48 abaa 48
49 abab 49
50 abac 50
51 abba 51
52 abbb 52
53 abbc 53
54 abca 54
55 abcb 55
56 abcc 56
57 acaa 57
58 acab 58
59 acac 59
60 acba 60
61 acbb 61
62 acbc 62
63 acca 63
64 accb 64
65 accc 65
66 baaa 66
67 baab 67
68 baac 68
69 baba 69
70 babb 70
71 babc 71
72 baca 72
73 bacb 73
74 bacc 74
75 bbaa 75
76 bbab 76
77 bbac 77
78 bbba 78
79 bbbb 79
80 bbbc 80
81 bbca 81
82 bbcb 82
83 bbcc 83
84 bcaa 84
85 bcab 85
86 bcac 86
87 bcba 87
88 bcbb 88
89 bcbc 89
90 bcca 90
91 bccb 91
92 bccc 92
93 caaa 93
94 caab 94
95 caac 95
96 caba 96
97 cabb 97
98 cabc 98
99 caca 99
100 cacb 100
101 cacc 101
102 cbaa 102
103 cbab 103
104 cbac 104
105 cbba 105
106 cbbb 106
107 cbbc 107
108 cbca 108
109 cbcb 109
110 cbcc 110
111 ccaa 111
112 ccab 112
113 ccac 113
114 ccba 114
115 ccbb 115
116 ccbc 116
117 ccca 117
118 cccb 118
119 cccc 119