Поиск всех элементов словаря списков, имеющих определенный элемент в этом списке

Я работал над проблемой через Розалинду. Прошла неделя с тех пор, как я застрял. Я постараюсь объяснить это как можно проще.

Ввод - строка называется Genome и целые числа k, L, а также t, Геном - это строка генетического кода для сортировки.

k это заданное целое число, размер каждого кмера. Кмер является подстрокой генетического кода, который может иметь некоторое значение. t количество раз, когда кмер появляется в глыбах. L длина текста, который образует сгусток. Например, если L = 400 мы ищем кмер, который происходит t раз в пределах группы 400 символов.

Выходные данные - все отдельные k-метры, образующие (L, t)-группы в геноме.

Этот код берет геном, разбивает его на всех возможных 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)

3 ответа

Изменить: Если я вас правильно понимаю, это может быть достигнуто довольно легко:

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'] получить значение ключа '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
(...)

Если я вас правильно понимаю, вам нужен список всех кмеров, которые являются ключами диктатора d,

Чтобы получить все ключи словаря, вы можете использовать keys() метод словарного класса, вот так:

kmer_list=d.keys()

Если вы хотите найти все последовательности, которые встречаются определенное количество раз, попробуйте:

occurance_times=4
kmer_list=filter(lambda x: d[x][0]==occurance_times, d.keys())
    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
Другие вопросы по тегам