Перебор пар букв в текстовом файле и подсчет вхождений

#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 вы открываете as f1 , но вы делаете 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)