查找列表中具有该列表中特定元素的字典的所有元素

时间:2014-01-02 22:05:56

标签: python rosalind

我正在通过罗莎琳德解决问题。我被困住了一周。我将尽可能简单地解释这一点。

输入 - 名为Genome的字符串,以及整数kLt。基因组是一串遗传密码。

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是出现次数,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)

3 个答案:

答案 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