現在、ジェネレータを作成し、itertoolsを使用することを学習しています。だから私は文字列インデックスジェネレータを作ることにしましたが、インデックスの生成を開始する場所を定義するための "開始インデックス"などのパラメータを追加したいと思います。文字列インデックスジェネレータに開始インデックスを追加します。
私は、大規模なインデックスの効率的な非常に長くないことができ、この醜い解決策を考え出した:何かアドバイスや改善は歓迎されている
import itertools
import string
class StringIndex(object):
'''
Generator that create string indexes in form:
A, B, C ... Z, AA, AB, AC ... ZZ, AAA, AAB, etc.
Arguments:
- startIndex = string; default = ''; start increment for the generator.
- mode = 'lower' or 'upper'; default = 'upper'; is the output index in
lower or upper case.
'''
def __init__(self, startIndex = '', mode = 'upper'):
if mode == 'lower':
self.letters = string.ascii_lowercase
elif mode == 'upper':
self.letters = string.ascii_uppercase
else:
cmds.error ('Wrong output mode, expected "lower" or "upper", ' +
'got {}'.format(mode))
if startIndex != '':
if not all(i in self.letters for i in startIndex):
cmds.error ('Illegal characters in start index; allowed ' +
'characters are: {}'.format(self.letters))
self.startIndex = startIndex
def getIndex(self):
'''
Returns:
- string; current string index
'''
startIndexOk = False
x = 1
while True:
strIdMaker = itertools.product(self.letters, repeat = x)
for stringList in strIdMaker:
index = ''.join([s for s in stringList])
# Here is the part to simpify
if self.startIndex:
if index == self.startIndex:
startIndexOk = True
if not startIndexOk:
continue
###
yield index
x += 1
。ありがとうございました!
EDIT:
開始インデックスは文字列である必要があります。
申し訳ありませんが、それは不明であったが、私は開始インデックスが文字列であることが予想場合。また、インデックスが25を超える場合、それは動作しないようです。最後に、「AZ」の後に、「BA」の代わりに「ABA」が得られます。 – UKDP
申し訳ありませんが、あなたをよく理解していませんでした。問題を考えると、再帰的なジェネレータのようなものが必要かもしれないと思うので、本質的に無限の深さのツリー構造をループしているからです。 – Yorian
ありがとうございます。それでもなお別の問題があります。私が "AAZ"の後のインデックスから始めると、私は無限ループに陥ります。 – UKDP