Поиск всех элементов словаря списков, имеющих определенный элемент в этом списке
Я работал над проблемой через Розалинду. Прошла неделя с тех пор, как я застрял. Я постараюсь объяснить это как можно проще.
Ввод - строка называется 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