-1

我正在通过 Rosalind 解决一个问题。自从我被卡住以来已经一周了。我将尝试尽可能简单地解释这一点。

输入 - 一个名为Genome, 和整数k, L, 和的字符串t。基因组是一串要分类的遗传密码。

k是一个给定的整数,每个 kmer 的大小。kmer 是遗传密码的一个子串,可能具有某种意义。t是 kmer 出现在簇中的次数。L是形成丛的文本的长度。例如,如果L = 400我们正在寻找一个t在 400 个字符的簇内出现次数的 kmer。

输出——所有不同的 k-mers 在基因组中形成 (L, t)-团块。

该代码获取基因组,将其分解为所有可能的 kmer 并将这些 kmer 插入字典。kmers 是钥匙。这些值设置为 [frequency_of_kmer, [kmer locations]]. 该值像这样存储在字典中:{'AAAAA' : [y, [z1,z2]]},其中y是出现次数,并且z1z2字符串中找到子字符串的索引。

基本上,我正在寻找迭代字典。我想找到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)
4

3 回答 3

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”中的第二个整数(第 7 个 dict 项,即 73):

d['AATGT'][1][1]

['AATGT']获取 key 的值'AATGT',第一个[1]访问最外层列表中的第二个项目,第二个[1]访问最内层列表中的第二个值。

73符合预期。

如果要遍历所有这些值,可以使用双 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
(...)
于 2014-01-02T22:39:24.377 回答
0

如果我对您的理解正确,您需要所有 kmers 的列表,它们是 dictonary 的键d

要获取字典的所有键,可以使用keys()字典类的方法,如下所示:

kmer_list=d.keys()

如果要查找出现一定次数的所有序列,请尝试:

occurance_times=4
kmer_list=filter(lambda x: d[x][0]==occurance_times, d.keys())
于 2014-01-02T22:13:38.680 回答
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
于 2014-02-06T05:21:33.507 回答