辞書編集的に X より大きく、Y より小さいすべての文字列を "python" で見つけるにはどうすればよいですか? X と Y は同じ長さです。
例:
X = "ab" and Y = "ad"
したがって、答えは次のようになります。
"ab", "ac" and "ad"
これどうやってするの?
辞書編集的に X より大きく、Y より小さいすべての文字列を "python" で見つけるにはどうすればよいですか? X と Y は同じ長さです。
例:
X = "ab" and Y = "ad"
したがって、答えは次のようになります。
"ab", "ac" and "ad"
これどうやってするの?
これを基数 26 から変換して整数の範囲を取得し、それらの整数を基数 26 に戻すと見なすことができますpip install python-baseconv
。
from string import ascii_lowercase
from baseconv import BaseConverter
def lex_range(start, end):
if len(start) != len(end):
raise ValueError('inputs must be same length')
B26 = BaseConverter(ascii_lowercase)
# use `xrange` in Py 2.x
for n in range(int(B26.decode(start)), int(B26.decode(end)) + 1):
yield B26.encode(n).rjust(len(start), 'a')
for result in lex_range('ab', 'ad'):
print(result)
注- 上記は、それらが辞書式である限り機能します。start <= end
同じ長さである必要はないlex_range('a', 'zz')
ため、目的の出力が生成されるため、明示的なlen
チェックが行われます。
出力:
# ab
# ac
# ad
あなたが探している答えは次のとおりだと思います:
X = 'ab'
Y = 'ad'
x = [chr(x) + chr(y) for x in range(ord(X[0]),ord(Y[0])+1) for y in range(ord(X[1]),ord(Y[1])+1)]
print(x)
あなたが始めることができるいくつかの疑似コード:
lower=...
upper=...
str = next(lower)
while before(str, upper) :
print(str)
str = next(str)
next
機能:
def next (str) :
if str[-1] != 'z' :
return str[:-1] + chr(ord(str[-1]) + 1) # increment last char
else:
return next( str[0:-1] ) + 'a' # reset last char and increment previous
before
機能:
def before (a, b) :
for i in 0.. (len(a)-1) :
if a[i] < b[i] :
return True
return False
最初に、現在の文字列の後の辞書編集上の次の文字列 (同じ長さで、文字 a ~ z のみを使用) を見つける関数、つまりインクリメントする関数を書きましょう。ほとんどの場合、これは簡単です。最後の文字をインクリメントするだけです。ただし、最後の文字がセット (z) で可能な最大の文字である場合は、a からやり直し、残りの文字列をインクリメントします。
def next(s):
front = s[:-1]
last = s[-1]
if last < 'z':
return front + chr(ord(last) + 1)
else:
return next(front) + 'a'
これを使用して、指定された範囲内のすべての文字列を出力できます。
def print_between(start, end):
s = start
while s <= end:
print (s)
s = next(s)
例:
print_between('ab', 'ad')