- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我看过类似的主题,但我找不到与我正在努力实现的目标完全相符的解决方案。
我有一个密文,需要根据每个字母在文本中出现的频率进行简单的字母替换。我已经有一个规范化文本的功能(小写,没有非字母字符,没有,计算字母出现的次数,然后得到每个字母的相对频率。字母是字典中的键,频率是值。
我在单独的字典中也有 A-Z 的预期字母频率(k=字母,v=频率),但我对接下来要做什么感到有点困惑。
我认为我需要做的是采用规范化密文、预期字母 freq dict [d1] 和密文字母 freq dict [d2] 并按如下方式迭代它们(部分伪代码):
for word in text:
for item in word:
for k,v in d2.items():
if d2[v] == d1[v]:
replace any instance of d2[k] with d1[k] in text
decoded_text=open('decoded_text.txt', 'w')
decoded_text.write(str('the decoded text')
在这里,我想获取文本并说“如果 d2 中的值与 d1 中的值匹配,则将文本中 d2[k] 的任何实例替换为 d1[k]”。
我意识到我一定在那里犯了一些基本的 Python 逻辑错误(我在 Python 方面相对较新),但我走在正确的轨道上吗?
提前致谢
更新:
感谢您提供的所有有用建议。我决定尝试 Karl Knechtel 的方法,并进行一些改动以适合我的代码。但是,我仍然遇到问题(完全在我的实现中)
我做了一个解码函数来获取有问题的密文文件。这会调用之前创建的计数函数,它返回一个字典(字母: float 形式的频率)。这意味着“制作大写版本”代码将不起作用,因为 k 和 v 不是 float 并且不能将 .upper 作为属性。因此,调用此解码函数会返回密文字母频率,然后是密文本身,仍然经过编码。
def sorted_histogram(a_dict):
return [x[1] for x in sorted(a_dict.items(), key=itemgetter(1))]
def decode(filename):
text=open(filename).read()
cipher=text.lower()
cipher_dict=count(filename)
english_histogram = sorted_histogram(english_dict)
cipher_histogram = sorted_histogram(cipher_dict)
mapping = dict(zip(english_histogram, cipher_histogram)
translated = ''.join(
mapping.get(c, c)
for c in cipher
)
return translated
最佳答案
您并不是真的想做您想做的事情,因为样本中字符的频率通常不会与引用数据中的确切频率分布相匹配 .您真正要做的是找到最常见 字符并将其替换为“e”,然后将其替换为“t”,依此类推。
所以我们要做的是:
(我假设你已经可以完成这部分)构造一个包含密文中实际字母频率的字典。
我们定义了一个函数,该函数接受 {letter: frequency} 字典并生成按频率顺序排列的字母列表。
我们按照频率顺序在我们的引用文献(即,现在我们有一个最常见的英语字母的有序列表)和样本(类似地)中获取字母。
假设样本中最常见的字母对应于英语中最常见的字母,依此类推:我们创建了一个新词典,将第一个列表中的字母映射到第二个列表中的字母。 (我们还可以创建一个用于 str.translate
的翻译表。)我们将制作同一词典的大写和小写版本(我假设您的原始词典只有小写)并合并它们在一起。
我们使用此映射来翻译密文,单独保留其他字符(空格、标点符号等)。
因此:
# 2.
import operator
def sorted_histogram(a_dict):
return [
x[1] # the value
for x in sorted(a_dict.items(), key=operator.itemgetter(1))
# of each dict item, sorted by value (i.e. the [1] element of each item).
]
# 3.
english_histogram = sorted_histogram(english_dict)
cipher_histogram = sorted_histogram(cipher_dict)
# 4.
# Make the lowercase version
mapping = dict(zip(english_histogram, cipher_histogram))
# Make the uppercase version, and merge it in at the same time.
mapping.update(dict(
(k.upper(), v.upper()) for (k, v) in zip(english_histogram, cipher_histogram)
))
# 5.
translated = ''.join( # make this list of characters, and string them together:
mapping.get(c, c) # the mapped result, if possible; otherwise the original
for c in cipher
)
# 6. Do whatever you want with 'translated' - write to file, etc.
关于python - 密文 Letter Freq Substitution : Comparing 2 dictionaries' dict keys by value and altering a text,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4425131/
2019-07-04:更新 结束使用 options: env: 不完美,因为在构建步骤中不允许变量,但至少涵盖了环境。 问题 GCP Cloud build不替换 substitutions
我正在使用 NSubstitute。我必须伪造一个类,无法挖掘出 Substitute.For() 的区别和 Substitute.ForPartsOf .我已经阅读了文档,但不明白两者的行为不同。
我正在尝试在 Agda 中使用等递归类型对按推值调用 lambda 演算进行编码。所以我用最多n个自由值类型变量相互定义值类型和计算类型(我只需要用值类型代替等递归类型)如下(这只是一个片段)。 da
有没有办法用s///同时进行替换?例如,如果我有一个带有1、2、3等数字的字符串,并且我想用“tom”代替1,用“mary”代替2,用“jane”代替3,等等? my $a = "1323131323
我有一个使用模板的 Jav::String 类。 class String { String(); String(std::size_t); template String(co
考虑以下 C99 结构,以灵活的数组成员结尾: struct hdr { size_t len; size_t free; char buf[]; }; 例如, len 可以通过这样
我有一个范围,包含数值和空白单元格。一些数值将以 * 作为后缀。 10* 5 7 9 25* 10 当我执行 SUM(A1:A8) 时,我得到 5+7+9+10 = 31 的结果,即所需的输出。
有没有办法一次交换多个字符串实例而不嵌套? 例如,假设我想从字符串中删除以下值的所有实例: 目标 沃尔玛 简历 输入字符串: “我去了 Target 而不是沃尔玛,但我真的很想去 CVS” 输出字符串
我在 Vim 的 substitute 中遇到了一个行为。 - 我不能的命令 真正遵循: 给定以下包含 && 的代码行我想要的序列 替换 &&与 &&和换行符: return a && b 在我的第一
为了说明我的问题,请使用以下简单示例。 我希望能够将“替换”和“那个”之间的任何文本替换为“完成”。例如,以下两个字符串: blah blah blah replace this and that b
我之前问过一个关于How to take in text/character argument without quotes的问题.在我在那个问题中提供的场景中,参数的数量是固定的,所以我在函数定义中
我正在尝试将一些 Selenium HTML 测试转换为使用 WebDriver 2.0 框架。根据网站 (http://seleniumhq.org/docs/03_webdriver.html),
那应该很容易...如何在下图中的标题中以粗体显示 i (=1)(仅调整参数 main)? i <- 1 plot(0~0, main=substitute(bold("foo"~i.~"bar"),
那应该很容易...如何在下图中的标题中以粗体显示 i (=1)(仅调整参数 main)? i <- 1 plot(0~0, main=substitute(bold("foo"~i.~"bar"),
这是一个现有的通用 css 规则(原始文件): .caption-top { color: red; } 这是示意图,因为在现实生活中,我需要根据上下文将 .caption-top 选择器变成其他
这是我的代码: $(".tooltip").live('click', function() { var texte = $('#tiptip_content').text(); $(
我需要帮助将变量子化为正则表达式 这条线工作正常: subject = subject.replace(//g, emoticons[1]); 我需要为变量切换单词“Smile”。 我尝试了一些不同的
我读了一篇摘要,其中在谈到继承时总是使用“替代原则”的定义。但并没有解释这个原理的含义。 这个原理是什么? 谢谢。 最佳答案 意思很简单:子类必须遵守父类(super class)设定的契约。 如果你
我有一个变量,它是一个 url,我想在 bash 中替换该 url 的一部分,但我一直收到“错误的替换” URL="http://hostname/project/branches/Old_Branc
#!/bin/bash jobname="job_201312161447_0003" jobname_pre=${jobname:0:16} jobname_post=${jobname:17} 这
我是一名优秀的程序员,十分优秀!