#python
#python
Вопрос:
У меня есть текстовый файл, называемый test.txt . В этом текстовом файле найдена следующая информация:
AATA
ATTA
TAAT
TATA
Теперь я хочу посмотреть на пары букв, которые встречаются во всех четырех сегментах букв, и подсчитать вхождения всех возможных пар букв. (существует 4 возможных комбинации: AA, AT, TA, TT). Сначала я хочу сделать это для позиции 1 (я называю это x = 1), где пары будут AA, AT, TA, TA. Затем я хочу вычислить процент вхождений каждой возможной комбинации, чтобы получить столбец 1 матрицы из 3 столбцов. (Здесь я бы нашел 1 вхождение AA, 1 вхождение AT и 2 вхождения TA. Таким образом, проценты для x = 1 будут:
p_AA = 25, p_AT = 25, p_TA = 50, p_TT = 0
Затем я хочу перейти в позицию 2 (x = 2), где пары будут AT, TT, AA, AT. Я бы снова рассчитал проценты:
p_AA = 25, p_AT = 50, p_TA = 0, p_TT = 25
Наконец, я бы перешел в позицию 3 (x = 3), чтобы получить пары TA, TA, AT, TA и снова вычислить проценты:
p_AA = 0, p_AT = 25, p_TA = 75, p_TT = 0
Чтобы суммировать все эти результаты, я хотел бы составить список, где столбец равен x, а строки представляют собой отдельные проценты. Я ожидал бы такого результата:
25, 25, 0
25, 50, 25
50, 0, 75
0, 25, 0
Однако у меня возникают проблемы с чтением и подсчетом двух букв за итерацию, а затем с их правильным размещением в этой матрице.
У меня есть следующий код:
with open("Test.txt", "r") as f1: lines = f1.readlines()
count_lines = len(content)
with open("Test.txt", "r") as f2: letters = f2.read()
count_letters = int((len(letters) - count_lines) / count_lines)
i = 0
j = 1
list = []
for x in range(1, count_letters):
AA = 0
AT = 0
TA = 0
TT = 0
for line in content:
if line[i] == "A" and line[j] == "A": AA = AA 1
if line[i] == "A" and line[j] == "T": AT = AT 1
if line[i] == "T" and line[j] == "A": TA = TA 1
if line[i] == "T" and line[j] == "T": TT = TT 1
sum = count_lines
p_AA = 100*AA/sum
p_AT = 100*AT/sum
p_TA = 100*TA/sum
p_TT = 100*TT/sum
i = i 1
j = j 1
Это кажется слишком громоздким, и мне не удается получить матрицу с указанными размерами, независимо от того, что я пытаюсь.
Комментарии:
1. Во втором
open
вы открываете asf1
, но вы делаетеf2.read()
, это выглядит неправильно. Кроме того, вы делаете этоlen(content)
во время фактического чтенияlines
. Я не думаю, что это рабочий код.
Ответ №1:
Предполагая, что все ваши пары будут присутствовать в вашем наборе данных хотя бы один раз в любой позиции любого из входных данных, вы можете просто использовать счетчики, затем создать фрейм данных pandas, транспонировать его и выполнить математические вычисления на нем.
import pandas as pd
l = ['AATA','ATTA','TAAT','TATA']
o = []
for i, x in enumerate(range(2,5)):
o.append(Counter([e[i:x] for e in l]))
df = pd.DataFrame(o)
((df.T/4)*100).fillna(0).values.tolist()
Вывод
[[25.0, 25.0, 0.0], [25.0, 50.0, 25.0], [50.0, 0.0, 75.0], [0.0, 25.0, 0.0]]
Ответ №2:
Вы могли бы использовать словарь. Это решило бы проблему, вам нужно создать счетчик для каждой пары. Это только для проблемы сопряжения.
def count_pairs(pairs, content):
for i in range(len(content)-1):
if content[i] == content[i 1]:
key = "{}{}".format(content[i].upper(), content[i].upper())
if key in pairs:
pairs[key] = 1
else:
pairs[key] = 1
pairs = dict()
count_pairs(pairs, content)