найти числовой индекс списка символов в алфавитном порядке по возрастанию

#python #sorting #cryptography

#python #сортировка #криптография

Вопрос:

Я пишу криптографическую программу, которая выполняет столбчатую транспозицию. пользователь вводит ключ в виде строки, например, key = ‘ZEBRAS’ Мне нужно определить числовой индекс, соответствующий каждой букве, в алфавитном порядке по возрастанию. например,

  • Z E B R A S
  • 6 3 2 4 1 5

A — самый высокий, поэтому его ранг 1. z — самый низкий, поэтому его ранг 6. Я хочу сохранить это значение в соответствующей структуре данных, поэтому, когда я перейду к шифрованию сообщения, я сначала прочитаю столбец, соответствующий позиции 1, и 6 последним.

Комментарии:

1. В чем проблема? Создание списка 6 3 2 4 1 5 , создание структуры данных, шифрование?

Ответ №1:

Создайте словарь из отсортированной и уникальной группы букв и индексов от 1 до длины строки (вам нужна уникальность или будет сгенерировано несколько индексов, если есть несколько вхождений букв a (как показано ниже, я добавил S к слову):

 s="ZEBRASS"
us=set(s)
sl=dict(zip(sorted(us),range(1,len(us) 1)))
print(sl)
  

sl содержит:

 {'Z': 6, 'A': 1, 'E': 3, 'R': 4, 'S': 5, 'B': 2}
  

Чтобы «зашифровать», примените словарь к вашей строке:

 sc = [sl[c] for c in s]
print(sc)
  

Результат:

 [6, 3, 2, 4, 1, 5, 5]
  

Комментарии:

1. не работает ни для какого другого регистра, кроме этого слова.

2. Интересно, как это не так. У вас есть пример слова, которое не работает?

3. Извините, я не был ясен в своем вопросе или комментарии. Я также хочу обрабатывать несколько экземпляров одних и тех же букв. Я решил это, создав класс class KeyChar(object): def __init__(self,l,pos,w): self.letter = l self.position = pos self . вес = w def setWeight(self,w): self . вес = w

Ответ №2:

Спасибо за материалы. Я ищу несколько повторяющихся букв для подсчета разных баллов. ТАКИМ образом, «ZEBRASAB» приведет к изображению zebrasab

то, что я сделал, было важно создать класс, используя открытый текст из ключа, чтобы найти индекс букв в строке, а также буквенный вес букв. затем я отсортировал его по начальному весу и позиции, затем скорректировал конечный вес, чтобы он был тяжелее, если он находится в более поздней позиции в строке.

 import alpha

class KeyChar(object):
def __init__(self,l,pos,w):
    self.letter = l
    self.position = pos
    self.weight = w
def setWeight(self,w):
    self.weight = w

def getRawKeyList(key):
key_list = []
key_weight_normalized = dict()
i = 0
for c in key:
    weight = alpha.giveAlphabet('u')[c]
    char = KeyChar(c,i,weight)
    i=i 1
    key_list.append(char)
return key_list

def adjustKeyWeights(key_obj_list):
#first sort based off weight
kchar_sorted = sorted(key_obj_list, key = lambda kchar: (kchar.weight,kchar.position))
i=0
for k in kchar_sorted:
    #print k.letter, k.position,
    k.setWeight(i) #readjust weights based on weight
    #print  k.weight
    i=i 1

return kchar_sorted 


# return weighted key sorted by letter weight (smallest letter first)
def getWeightedKeyList(key):
k_adjusted = adjustKeyWeights(getRawKeyList(key))
final_key =  sorted(k_adjusted, key = lambda kchar: kchar.weight)
key_list = getKeyAsList(final_key)
return final_key,key_list



def main():
key = 'ZEBRASAB'
key_obj_list,key_list = getWeightedKeyList(key.upper())
 #DEBUGGING / TESTING
for k in key_obj_list:
    print k.letter, k.position, k.weight

main()
  

Ответ №3:

Создайте временный список для хранения отсортированного слова и извлеките позицию из временного списка. Ниже приведен пример кода:

 >>> word = 'ZEBRAS'
>>> sorted_word = sorted(word)

>>> sorted_word
['A', 'B', 'E', 'R', 'S', 'Z']

>>> index_string = [sorted_word.index(a) 1 for a in word]
>>> index_string
[6, 3, 2, 4, 1, 5]