Я создал словарь, используя этот код:исправляющие значения в словаре
import collections
exons = collections.defaultdict(list)
with open('test_coding.txt') as f:
for line in f:
chrom, start, end, isoform = line.split()
exons[isoform].append((int(start), int(end)))
Этот код производит словарь, который выглядит так:
{'NM_100': [(75, 90), (100, 120)], 'NM_200': [(25, 50), (55, 75), (100, 125), (155, 200)]})
из этого файла:
chr1 75 90 NM_100
chr1 100 120 NM_100
chr2 25 50 NM_200
chr2 55 75 NM_200
chr2 100 125 NM_200
chr2 155 200 NM_200
Что я хочу сделать, это вычесть первое значение в списке (в первом случае, 75 и 25 для второго случая) от каждого г значение в конкретном списке для требуемого выхода:
{'NM_100': [(0, 15), (25, 45)], 'NM_200': [(0, 25), (30, 50), (75, 100), (130, 175)]})
Я думал, что мне нужно, чтобы создать свой словарь в качестве альтернативного способа. Вид вроде ниже, но я не могу заставить эту функцию работать правильно.
def read_exons(line):
parts = iter(line.split()) #I think the problem is here
chrom = next(parts)
start = next(parts)
end = next(parts)
base = start[0] #and here
return name, [(s-base, e-base) for s, e in zip(start, end)]
with open('testing_coding.txt') as f:
exons = dict(read_exons(line) for line in f
if not line.strip().startswith('#'))
Любые предложения?
Я попытался использовать этот пример, но я продолжаю получать ошибку: 'TypeError: неподдерживаемый тип операндов для -: 'str' и 'str'' для последней строки. Нужно ли делать значения 'start' и' firstvalues [isoform] 'integers независимо? – interstellar
Да, вам нужно сделать их целыми числами. Позвольте мне уточнить это в ответ. –
Обновлен ответ. –