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