Вместо того, чтобы переписать вашу программу для вас, я опишу, как решить такую проблему, которая в основном включает в себя небольшую математику.
Суть вашего вопроса сводится к тому, каксмещение заданного диапазона целочисленных значений на заданную величину и перенос результатов так, чтобы они все еще находились в исходном диапазоне значений.
Это можно сделать математически для каждого значения в диапазоне, вычитая минимальное значение в диапазонедобавляя к этому смещение, вычисляя сумму по модулю разности между верхним и нижним значениями диапазона (+1), а затем, наконец, добавляя минимальное значение обратно, чтобы компенсировать его первоначальное вычитание. Важной частью является операция по модулю %
для ограничения суммы.
Код в функции offset_range()
ниже показывает, как сделать все это внутри списка понимания , который является сокращенным способом создания списков в Python.
Это и функция print_range()
также служат для иллюстрации того, как функции определяются в Python.
def print_range(name, range_):
""" Pretty-print given range of character ordinals. """
ints = ', '.join('{:3d}'.format(val) for val in range_)
chrs = ', '.join('{:>}'.format(repr(chr(val))) for val in range_)
print('{}: [{}]'.format(name, ints))
print('{} [{}]'.format(len(name)*' ', chrs))
def offset_range(offset_value, range_):
""" Add offset value to integers in given range and wrap result. """
min_val, max_val = range_[0], range_[-1] # Get upper and lower limits.
diff_plus_1 = (max_val - min_val) + 1 # Their difference + 1 for computation.
# Use a list comprehension to create new list.
offset_range = [(((val - min_val) + offset_value) % diff_plus_1) + min_val
for val in range_]
return offset_range
ascii_range = list(range(ord('a'), ord('~')+1))
print_range('ascii_range', ascii_range)
print()
offset_range = offset_range(1, ascii_range)
print_range('offset_range', offset_range)
Вывод:
ascii_range: [ 97, 98, 99, 100, 101, 102, 103, 104, 105, ... 122, 123, 124, 125, 126]
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', ... 'z', '{', '|', '}', '~']
offset_range: [ 98, 99, 100, 101, 102, 103, 104, 105, ... 122, 123, 124, 125, 126, 97]
['b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', ... 'z', '{', '|', '}', '~', 'a']