gpt4 book ai didi

python - 用另一个字符替换字符串中所有出现的所有字符,而不会相互干扰

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:21:20 25 4
gpt4 key购买 nike

我开始从一本书上学习一些密码学,现在我有一个练习要我从一个字符串中找出每个字符的频率:

像这样:

import collections

my_coded_string = """NTCGPDOPANFLHJINTOOFITOVJHJCTMMHIHEMTCPFDWTSOFSHTOGFWTE
TTJJTBTOOFSZOVEOCHCVCHPJHOCGTOHNQMTOCNTCGPDCGFCSTQMFBTO
FBGFSFBCTSHJCGTQMFHJCTYCXHCGFAHYTDDHAATSTJCBGFSFBCTSHJC
GTBHQGTSCTYCCGHONTCGPDQSTOTSWTOCGTMTCCTSASTRVTJBZHJCGTQ
MFHJCTYCFJDOPPJTBFJOTFSBGAPSCGTQMFHJCTYCASPNFIHWTJBHQGT
SCTYCEZBPNQFSHJICGTASTRVTJBZPATFBGMTCCTSFIFHJOCCGTLJPXJ
BPNNPJASTRVTJBZHJCGTVJDTSMZHJIMFJIVFIT"""

letters = collections.defaultdict(float)
for letter in my_coded_string:
letters[letter] += 1

d_descending = OrderedDict(sorted(letters.items(), key=lambda x: x[-1], reverse=True))
print d_descending

这将返回一个类型为 float 的字典,其中包含所有键及其频率(按降序排列)。到目前为止一切顺利,没有什么可怕的。

输出:

([
('T', 57.0), ('C', 40.0), ('J', 29.0), ('F', 27.0), ('H', 26.0), ('S', 23.0), ('G', 22.0), ('O', 20.0), ('B', 16.0),
('P', 15.0), ('M', 12.0), ('A', 10.0), ('N', 10.0), ('I', 9.0), ('Q', 9.0), ('D', 8.0), ('V', 8.0), ('Y', 6.0),
('Z', 6.0), ('E', 4.0), ('W', 4.0), ('R', 3.0), ('L', 2.0), ('X', 2.0)
])

现在,他们说为了解码这个字符串,我必须将这些频率与他们提供的频率进行比较,这似乎是英语中每个字符的预期频率。

enter image description here

现在,我遇到的问题是:如何用第一个频繁出现的字母 E 替换所有出现次数最多的字母 T英文字母表,然后是 CT 等等?

在某些时候,当我将 T 替换为 E 时,我将拥有 57 个 E,但我还将拥有剩余的 e。有什么想法吗?

最佳答案

如果您还为预期英语的映射创建了一个 OrderedDict语言(降序),你将能够创建一个第二个 dict 可用于将 my_coded_string 合二为一迭代。

假设预期的英文映射称为 freqs:

translate_table = dict(zip(d_descending, freqs))
my_string = ''.join([translate_table[c] for c in my_coded_string])

假设您还想处理换行符 (\n),下面是一个完整的工作代码:

import collections
import itertools

freqs = collections.OrderedDict([
('e', 12.702), ('t', 9.056), ('a', 8.167), ('o', 7.507),
('i', 6.749), ('n', 6.749), ('s', 6.327), ('h', 6.094),
('r', 5.987), ('d', 4.253), ('l', 4.052), ('c', 2.782),
('u', 2.758), ('m', 2.406), ('w', 2.360), ('f', 2.228),
('g', 2.015), ('y', 1.974), ('p', 1.929), ('b', 1.492),
('v', 0.978), ('k', 0.772), ('j', 0.153), ('x', 0.150),
('q', 0.095), ('z', 0.074)])

my_coded_string = """NTCGPDOPANFLHJINTOOFITOVJHJCTMMHIHEMTCPFDWTSOFSHTOGFWTE
TTJJTBTOOFSZOVEOCHCVCHPJHOCGTOHNQMTOCNTCGPDCGFCSTQMFBTO
FBGFSFBCTSHJCGTQMFHJCTYCXHCGFAHYTDDHAATSTJCBGFSFBCTSHJC
GTBHQGTSCTYCCGHONTCGPDQSTOTSWTOCGTMTCCTSASTRVTJBZHJCGTQ
MFHJCTYCFJDOPPJTBFJOTFSBGAPSCGTQMFHJCTYCASPNFIHWTJBHQGT
SCTYCEZBPNQFSHJICGTASTRVTJBZPATFBGMTCCTSFIFHJOCCGTLJPXJ
BPNNPJASTRVTJBZHJCGTVJDTSMZHJIMFJIVFIT"""

def translate(coded):
coded_lines = coded.split('\n')
letters = collections.defaultdict(float)
for letter in itertools.chain(*coded_lines):
letters[letter] += 1

mapping = dict(zip(
(i[0] for i in sorted(letters.items(),
key=lambda x: x[-1], reverse=True)),
freqs.keys()))

return '\n'.join(''.join(mapping[letter] for letter in line)
for line in coded_lines)

print(translate(my_coded_string))

关于python - 用另一个字符替换字符串中所有出现的所有字符,而不会相互干扰,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33568267/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com