python - 如何从字典中删除重复的键值
问题描述
所以我正在写一些代码并且遇到了一个障碍,我需要从我的字典中删除重复值。我在这里看到了一些关于转换为元组和使用集合只保留唯一值的帖子。但是,这些解决方案对我不起作用,因为我的值是整数而不是列表。
因此,只是想知道是否有人可以提供帮助/指明道路会非常感激。请在下面找到代码。
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)
现在您可以按降序对频率的键进行排序,并且仅当存储为值的列表的大小为 1 时才替换与该频率相关的字母。例如,如果其中一个键freqs
是 9,则只需检查if len(freqs[9]) == 1
与否。如果是,请用您选择的字母替换给出freqs[9][0]
的字母。ltrfreq
推荐阅读
- c++ - 如何重构以下课程
- php - WooCommerce - 在用户注册时将显示名称设置为名字
- javascript - React - 仅更新被点击元素的状态
- dart - 如何在构造函数中将常量值分配为默认值
- javascript - 使用reduce返回具有每个对象值总和的新对象数组
- json - React:在动态输入字段中动态添加输入字段
- shopify - 使用 shopify checkout api 创建自定义结帐
- flutter - Flutter 中的状态可以调用自身吗?
- python-sphinx - 警告:点命令 dot 无法运行
- angular - Gitlab CI 为 Angular 应用程序获取“[Launcher]:您的平台上的 Chrome 浏览器没有二进制文件”