所以我正在写一些代码并且遇到了一个障碍,这个障碍是我需要从我的字典中删除重复的值。我在这里看到了一些关于转换为元组和使用集合只保留唯一值的帖子。然而,这些解决方案对我不起作用,因为我的值是一个整数而不是一个列表。
因此,只是想知道是否有人可以提供帮助/指出方向将非常感激。请在下面找到代码。
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
据我了解,您正在尝试根据字母的频率将文本中的字母替换为字母。而您想要实现的是,不会替换具有相同频率的字母。也就是说,如果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)
现在,您可以按降序对 freqs 的键进行排序,并且仅当存储为 value 的列表的大小为 1 时才替换与该频率关联的字母。例如,如果其中一个键freqs
是 9,则只需检查if len(freqs[9]) == 1
与否。如果是,请用您选择freqs[9][0]
的字母替换给定的字母ltrfreq
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句