首页 > 解决方案 > 如何从字典中删除重复的键值

问题描述

所以我正在写一些代码并且遇到了一个障碍,我需要从我的字典中删除重复值。我在这里看到了一些关于转换为元组和使用集合只保留唯一值的帖子。但是,这些解决方案对我不起作用,因为我的值是整数而不是列表。

因此,只是想知道是否有人可以提供帮助/指明道路会非常感激。请在下面找到代码。

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

标签: pythonpython-3.xdictionaryset

解决方案


据我了解,您正在尝试根据频率用字母替换文本中的字母。而你想要实现的是频率相同的字母不会被替换。那就是如果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


推荐阅读