python独特的字符串创建

时间:2012-10-25 06:27:36

标签: python algorithm python-2.7

我已经看过其他几个与此类似的问题(以及google'd吨),但它们似乎都不符合我的问题。

我正在尝试创建一个非固定长度的唯一文本字符串,只包含我指定的字符串中的字符。例如。由大写和小写的a-zA-Z字符组成。 (对于这个例子,我只使用a,b和c小写)

像这样的东西(下面的代码破碎)

def next(index, validCharacters = 'abc'):
    return uniqueShortAsPossibleString

index参数是与文本字符串相关的索引(整数),例如:

next(1)  == 'a'
next(2)  == 'b'
next(3)  == 'c'

next(4)  == 'aa'
next(5)  == 'ab'
next(6)  == 'ac'

next(7)  == 'ba'
next(8)  == 'bb'
next(9)  == 'bc'

next(10) == 'ca'
next(11) == 'cb'
next(12) == 'cc'

等等。字符串:

  1. 必须是唯一的,我会将它用作标识符,并且它只能是a-zA-Z字符
  2. 尽可能短,索引编号较短(见上例)
  3. 仅包含给定参数字符串validCharacters
  4. 中指定的字符

    总之,如何编写next()函数将整数索引值与指定字符的唯一短字符串相关联?

    P.S。我是SO的新手,这个网站多年来一直帮助我,虽然我从来没有做过账号或问过问题(到现在为止),但我真的希望我做得很好,解释我的意思。试图用这个完成。

6 个答案:

答案 0 :(得分:3)

您要做的是将next函数的参数写入另一个基础。

假设validCharacters包含k个字符:那么next函数的工作就是通过使用字符将参数p转换为基础kvalidCharacters

在您的示例中,您可以在基数3中写入数字,然后将每个数字与一个字母相关联:

next(1) -> 1 -> 'a'
next(2) -> 2 -> 'b'

next(4) -> 11 -> 'aa'
next(7) -> 21 -> 'ba'

等等。

使用此方法,您可以在不知道或计算任何next(x)的情况下调用next(x-i),这是迭代方法无法做到的。

答案 1 :(得分:1)

itertools总能给你混淆的单行迭代器:

from itertools import combinations_with_replacement, chain

chars = 'abc'
a = chain(*(combinations_with_replacement(chars, i) for i in range(1, len(chars) + 1)))

基本上,此代码创建一个迭代器,它结合了chars长度12,...,len(chars)的所有组合。

for x in a: print x的输出是:

('a',)
('b',)
('c',)
('a', 'b')
('a', 'c')
('b', 'a')
('b', 'c')
('c', 'a')
('c', 'b')
('a', 'b', 'c')
('a', 'c', 'b')
('b', 'a', 'c')
('b', 'c', 'a')
('c', 'a', 'b')
('c', 'b', 'a')

答案 2 :(得分:1)

您无法将索引与恼人的“关联”,但以下是一个将产生并提供您要求的输出的生成器:

from itertools import combinations_with_replacement

def uniquenames(chars):
    for i in range(1, len(chars)):
        for j in combinations_with_replacement(chars, i):
            yield ''.join(j)

print list(uniquenames('abc'))
# ['a', 'b', 'c', 'aa', 'ab', 'ac', 'bb', 'bc', 'cc']

答案 3 :(得分:1)

据我所知,我们不应指定输出字符串的最大长度。所以range还不够:

>>> from itertools import combinations_with_replacement, count
>>> def u(chars):
...     for i in count(1):
...         for k in combinations_with_replacement(chars, i):
...             yield "".join(k)
... 
>>> g = u("abc")
>>> next(g)
'a'
>>> next(g)
'b'
>>> next(g)
'c'
>>> next(g)
'aa'
>>> next(g)
'ab'
>>> next(g)
'ac'
>>> next(g)
'bb'
>>> next(g)
'bc'

答案 4 :(得分:1)

您正在尝试将数字转换为另一个数字中的数字,但使用任意字符表示该数字的数字。

import string
chars = string.lowercase + string.uppercase

def identifier(x, chars):
    output = []
    base = len(chars)
    while x:
        output.append(chars[x % base])
        x /= base
    return ''.join(reversed(output))

print identifier(1, chars)

这允许你跳转到任何位置,你计算所以标识符是完全唯一的,并且很容易使用任何长度(两个或更多)的任何字符集,而较低的数字给出较短的标识符。

答案 5 :(得分:0)

因此,您似乎想要枚举语言{'a','b','c'}生成的所有字符串。这可以使用finite state automata完成(尽管您不想这样做)。枚举该语言的一种简单方法是从列表开始并按顺序追加长度为1的所有字符串(所以a然后是b然后是c)。然后将字母表中的每个字母附加到长度为n-1的每个字符串中。只要您将字母表中的所有字母附加到给定字符串,然后再转到按字典顺序排列的下一个字符串,这将保持正常。