我正在通过罗莎琳德解决问题。我被困住了一周。我将尽可能简单地解释这一点。
输入 - 名为Genome
的字符串,以及整数k
,L
和t
。基因组是一串遗传密码。
k
是给定的整数,即每个kmer的大小。 kmer是遗传密码的子串,可能具有某种意义。 t
是kmer出现在丛中的次数。 L
是形成丛的文本长度。例如,如果L = 400
我们正在寻找一个在400个字符的丛中发生t
次的kmer。
输出 - 在基因组中形成(L,t) - 团块的所有不同的k聚体。
此代码采用基因组,将其分解为所有可能的kmers并将这些kmers插入字典中。 kmers是关键。值设置如下
[frequency_of_kmer, [kmer locations]]
。该值在字典中存储如下:{'AAAAA' : [y, [z1,z2]]}
,其中y
是出现次数,z1
和z2
是字符串中的索引,其中子字符串是找到。
基本上,我希望迭代字典。我想在文本中找到t
次出现的密钥。也就是说,我想查找字典d
的所有键,以便d[key]==t
。
下面的代码,然后是输出。
代码:
from pprint import pprint
genome = "CGGACTCGACAGATGTGAAGAAATGTGAAGACTGAGTGAAGAGAAGAGGAAACACGACACGACATTGCGACATAATGTACGAATGTAATGTGCCTATGGC"
k = 5
L = 75
t = 4
len_genome = int(len(genome))
l = []
for i in range (len_genome - k + 1):
kmer = genome[i:i +k]
# list of every possible kmer
l.append(kmer)
d = {}
for i in range (len(l)):
try:
d[l[i]][0] += 1
d[l[i]][1].append(i)
except KeyError:
d[l[i]] = [1, [i]]
pprint(d)
答案 0 :(得分:1)
修改强> 如果我理解正确,这可以很容易实现:
from pprint import pprint
x = 4
pprint({key: value for key, value in d.iteritems() if value[0] == x})
<强>输出:强>
{'AATGT': [4, [21, 73, 81, 86]],
'CGACA': [4, [6, 54, 59, 67]],
'GAAGA': [4, [16, 26, 37, 42]]}
(以下原始答案)
我不知道什么是丛,但这是你访问的方式,比如AATGT&#39;中的第二个整数。 (第7个dict项目,即73):
d['AATGT'][1][1]
['AATGT']
获取密钥'AATGT'
的值,第一个[1]
访问最外层列表中的第二个项目,第二个[1]
访问第二个值最里面的清单。
按预期产生73
。
如果要迭代所有这些值,可以使用double for循环:
# d.iteritems() should be d.items() in Python 3.x
for key, sublist in d.iteritems():
print('kmer: {}'.format(key))
for value in sublist[1]:
print value
这会产生
kmer: ACACG
51
56
kmer: TAATG
72
85
kmer: AGAGG
44
kmer: GGACT
1
(...)
答案 1 :(得分:0)
如果我理解正确,你需要所有kmers的列表,这是dictonary d
的关键。
要获取字典的所有键,可以使用字典类的keys()
方法,如下所示:
kmer_list=d.keys()
如果要查找出现一定次数的所有序列,请尝试:
occurance_times=4
kmer_list=filter(lambda x: d[x][0]==occurance_times, d.keys())
答案 2 :(得分:0)
from collections import defaultdict
code="AGCTTTT...TTTTTC"
(k,L,t,counter,results) = (9,500,3,1,[])
d = defaultdict(list)
for z in range (0,len(code)):
d[code[z:z+k]].append(z)
for value in d.items():
if len(value[1])>=3:
for y in range(0,len(value[1])-2):
if value[1][y+t-1]-value[1][y] <= L-k:
results.append(value[0])
results.sort()
if len(results)==0:
print "No result"
if len(results)==1:
print results[0],
print 1
if len(results)>1:
print results[0],
for i in range (0,len(results)-1):
if results[i+1]!=results[i]:
counter += 1
print results[i+1],
print counter