2015-03-29 3 views
1

Как я могу найти все строки в «python», которые лексикографически больше X и меньше Y? X и Y имеют одинаковую длину.Все строки лексикографически больше X и меньше Y

Пример:

X = "ab" and Y = "ad" 

Таким образом, ответ будет:

"ab", "ac" and "ad" 

Как я могу это сделать?

+0

На каком языке? Английский? Французский? Немецкий? –

+0

@PeterWood: Отредактировано заявление о проблеме. Его в Python – bazinga

+0

Что вы попробовали? Что не сработало? – lodo

ответ

0

Некоторые псевдокод вы можете начать с:

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 
+0

Я предполагаю, что ваша функция 'next' неверна. Я бы сделал 'return str [: - 1] + chr (ord (str [-1]) + 1)' в первом случае и 'return next (str [: - 1]) + 'a'' во втором дело. –

+0

@TigranSaluev спасибо. – lodo

0

Я думаю, что ответ вы ищете:

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) 
+0

Очень умное решение. Жаль, что он работает только со строками длины 2. – lodo

0

Вы можете рассматривать это как преобразование от основания 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 
0

Во-первых, давайте напишем функцию, чтобы найти лексикографически следующую строку после текущей (с той же длины, и только с использованием символов 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') 
Смежные вопросы