我有一个包含4个字母的句子文件。我需要计算每个字母的出现次数,然后按字母出现次数对字母进行排序,然后将句子写入相应的文件。
例如,如果字母T
的出现次数最多,那么A
,C
,G
按顺序排列,我想将句子写入一个名为TACG
的文件。
我知道如何读取和写入文件,并且我已经设法构建了一个包含每个字母并且它出现的字典,唯一要做的就是对字典进行排序并将名称输入到归档它。
在Python中执行此操作的最佳方法是什么?
答案 0 :(得分:1)
您可以使用str.join
和collections.Counter
在一条(短)行中执行此操作:
>>> from collections import Counter
>>> "".join([t[0] for t in Counter('TTTTAAACCG').most_common()])
'TACG'
请注意,根据most_common
的文档:
具有相同计数的元素是任意排序的
答案 1 :(得分:0)
Counter
答案很好,但您最初要求提供字典 - 所以这就是我的想法 -
在我看来,实现这一目标的最简单方法就是“#pythonic"并会这样:
# assuming `d` is your dictionary
order_as_string = ''.join([y[0] for y in sorted(d.iteritems(), key=lambda x: x[1], reverse=True)])
执行以下操作:
(1)sorted(d.iteritems(), key=lambda x: x[1], reverse=True)
- 返回一个元组列表,每个元组的形式(键,值)都来自字典d
,并按d
中每个项的值排序。 reverse=True
确保按降序排序。
(2)[y[0] for y in sorted...]
- 对于(1)中的每个元组,抓住"键" part(该元组的0项)。从中生成一个列表。
(3)''.join(...)
- 用空字符串连接list(2)中的所有项目,生成一个新字符串。
希望有所帮助!
答案 2 :(得分:0)
假设您已经在字符串变量's'
s = 'TACGAGAGCTAGGCAAGCTTGATGCTAGGAA'
letters = set(s)
我会计算每个字母出现在字符串中的次数,然后列出元组列表,格式为(letter, count)
。
l = [(letter, s.count(letter)) for letter in letters]
>>> l
[('C', 5), ('A', 10), ('T', 6), ('G', 10)]
然后只需按计数对列表进行排序。
>>> sorted(l, key = lambda i: i[1], reverse = True)
[('A', 10), ('G', 10), ('T', 6), ('C', 5)]
现在我们已经有了排序列表,只需迭代它就可以抓取字母和join
。
filename = ''.join(i[0] for i in sorted(l, key = lambda i: i[1], reverse = True))
>>> filename
'AGTC'