2013-09-27 6 views
-3

Есть ли функция, например change_alphabetical ($ string, $ number), которая меняет каждую букву в строке $ string, $ number times forward?python a = b b = c function ETC

ПРИМЕР

print change_alphabetical("abc",2) 

печатает:

"cde" 

ИЛИ

change_alphabetical("abc",-1) 

печатает:

zab 
+0

http://code.activestate.com/recipes/578545-caesar-ciphers-program-in-python/ –

+5

Каков ожидаемый результат для 'change_alpabetical ('ab12cd', 1) и' change_alphabetical («Ордоньес», -1) '? – Hyperboreus

ответ

2
import string 

def change(word, pos): 
    old = string.ascii_lowercase 
    new = old[pos:] + old[:pos] 
    return word.translate(string.maketrans(old, new)) 
2

Я не знаю ни встроенных команд, что делает это, но вы можете свернуть свой собственный:

def change(string, position): 
    alphabet = "abcdefghijklmnopqrstuvwxyz" 
    indexes = [alphabet.find(char) for char in string] 
    new_indexes = [(i + position) % 26 for i in indexes] 
    output = ''.join([alphabet[i] for i in new_indexes]) 
    return output 

print change("abc", -1) # zab 

Это по существу принимает каждый символ во входной строке, и преобразует его в числовую позицию с помощью метода some_list.find(). Затем он добавляет смещение, mod 26, чтобы получить новый индекс, а затем новую строку.

Имейте в виду, что это работает только с строчными буквами (хотя вы всегда можете сделать string = string.lower()), и вам нужно будет отрегулировать, если вы хотите использовать другой алфавит, кроме английского.


Если вы хотите, чтобы код для работы на международном уровне, можно использовать locale модуль, чтобы получить местный алфавит дал некоторый произвольный язык:

import locale 
locale.setlocale(locale.LC_ALL, '') 

import string 

def change(string, position): 
    alphabet = string.lowercase 
    indexes = [alphabet.find(char) for char in string.lower()] 
    new_indexes = [(i + position) % len(alphabet) for i in indexes] 
    output = ''.join([alphabet[i] for i in new_indexes]) 
    return output 

В настоящее время это просто получает алфавит любой местный для текущего компьютера установлено значение. Я считаю, что вы можете изменить базовый язык, отредактировав второй аргумент в locale.setlocale.

Атрибут string.lowercase затем вернет все буквы нижнего регистра данного языка в порядке.

Имейте в виду, что locale.setlocale не считается потокобезопасным и распространяется на всю программу.

Смежные вопросы