我已经看过其他几个与此类似的问题(以及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'
等等。字符串:
总之,如何编写next()函数将整数索引值与指定字符的唯一短字符串相关联?
P.S。我是SO的新手,这个网站多年来一直帮助我,虽然我从来没有做过账号或问过问题(到现在为止),但我真的希望我做得很好,解释我的意思。试图用这个完成。
答案 0 :(得分:3)
您要做的是将next
函数的参数写入另一个基础。
假设validCharacters
包含k
个字符:那么next
函数的工作就是通过使用字符将参数p
转换为基础k
在validCharacters
。
在您的示例中,您可以在基数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
长度1
,2
,...,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的每个字符串中。只要您将字母表中的所有字母附加到给定字符串,然后再转到按字典顺序排列的下一个字符串,这将保持正常。