因此,我正在编写一些代码,遇到了麻烦,我需要从字典中删除重复的值。我在这里看到了一些有关转换为元组和使用集合仅保留唯一值的文章。但是这些解决方案对我不起作用,因为我的值是整数而不是列表。
因此,我想知道是否有人可以帮助/指出前进的方向将非常感激。请在下面找到代码。
import string
# Variables and the like
alphabet = string.ascii_uppercase
fname = input('Enter the name of file which contains the cipher text: ')
file = open(fname+'.txt', 'r')
ctext = file.read()
ltrfreq = ['E','T','A','O','I','N','S','R','H','L','D','C','U','M','F','P','G','W','Y','B','V','K','X','J','Q','Z']
freqs = {}
# creating a dictionary which pairs letters to the frequency in the text
for i in alphabet:
if ctext.count(i) == 0:
continue
else:
freqs[i] = ctext.count(i)
print(freqs)
# Need some code that removes duplicate values so as we don't replace letters that have the same frequency
# Replacing the highest frequency letters with the expected value
n = 0
for i in range(0, len(freqs)):
maximum = max(freqs, key=freqs.get)
for j in ctext:
ctext = ctext.replace(maximum, ltrfreq[n])
del freqs[maximum]
n += 1
print(ctext)
作为输入的文件只是一个.txt文件,该文件仅包含以下示例内容:
XULTPAAJCXITLTLXAARPJHTIWTGXKTGHIDHIPXCIWTVGTPILPITGHLXIWIWTXGQADDS
答案 0 :(得分:1)
据我了解,您正在尝试根据字母的出现频率用字母替换文本中的字母。而您想要实现的是不替换具有相同频率的字母。也就是说,ctext
的编号相同。在出现A和O的情况下(例如4),两个都没有被替换。
为此,您可以更改freqs
的定义方式。当前,它以字母为键,以频率为值。
相反,请尝试使用频率作为键,并且将具有该频率的所有字母作为值存储在列表中。
看起来如何-{1:["A"], 2:["B", "C"]}
要实现这一目标,我相信这段代码会起作用-
for i in alphabet:
count = ctext.count(i)
if count == 0:
continue
else:
freqs[count] = freqs.get(count, []) + [i]
print(freqs)
现在,仅当存储为值的列表大小为1时,您才能按降序对频率键进行排序,并替换与该频率相关的字母。
例如,如果freqs
中的键之一为9,则只需检查if len(freqs[9]) == 1
。
如果是,请用您选择的freqs[9][0]
中的字母替换ltrfreq
中的字母。