查找按字母顺序升序排列的字符列表的数字索引

2024-04-18 03:57:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在写一个加密程序,它可以进行列换位。 一个人以字符串的形式输入一个键,例如,key='ZEBRAS' 我需要确定每个字母对应的数字索引,按字母升序排列。 例如

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

A是最高的,所以它排名第一。z是最低的,所以它的等级是6。 我想将这个值存储到一个适当的数据结构中,所以当我去加密一条消息时,我会首先读取对应于位置1的列,最后读取对应于位置6的列。你知道吗


Tags: key字符串程序消息数据结构字母数字形式
3条回答

从已排序的唯一字母组创建字典,索引从1到字符串长度(您需要unicity,如果一个字母出现了多次,则会生成多个索引(如下所示,我在单词中添加了一个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]

创建一个临时列表来存储排序后的单词,并从临时列表中提取位置。下面是示例代码:

>>> 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]

谢谢你的意见书。我正在寻找多个重复的字母作为一个不同的分数计算。所以“斑马”会变成zebrasab picture

我所做的是使用键中的纯文本创建一个类,以查找字符串中字母的索引,以及字母的字母权重。然后我按初始重量和位置对它进行排序,然后调整最后的重量,使其在字符串的后面位置更重。你知道吗

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()

相关问题 更多 >