Редактировать определенную часть списка внутри списка - PullRequest
1 голос
/ 19 июня 2020

Я относительно новичок в python и работаю над алгоритмом, включающим генетический c код. Я начал с связывания всех 4 генети c баз, A, C, T, G со списком. А равно 1,0,0,0. C равно 0,1,0,0. T равно 0,0,1,0, а G равно 0,0,0,1. Есть два разных генетических кода c, один из которых является исходным, а другой - генетически мутированным. Алгоритм будет делать выводы на основе предоставленных данных на основе разницы между двумя кодами geneti c. Но сначала мне нужно предварительно обработать данные, прежде чем я смогу работать над алгоритмом, делая выводы.

A = [1, 0, 0, 0]
C = [0, 1, 0, 0]
T = [0, 0, 1, 0]
G = [0, 0, 0, 1]
original = [A, T, T, G, C]
copy = [C, T, T, A, T]

final = original[:] 
for i, v in enumerate(original):
    if v == copy[i]: 
       print(v)
    elif v != copy[i]: 
        v.insert(0, ("add"))  
        print(v)

Это результат:

enter image description here

Я пытаюсь сделать алгоритм так, чтобы алгоритм сравнивал исходный код и код копии c, элемент за элементом. Он проверяет, равны ли все буквы. Для первого A и C не равны. Если он не равен, я хочу, чтобы алгоритм выводил 1,1,0,0. По существу перекрывают две буквы. ЕСЛИ алгоритм видит, что код такой же, например, второй, T&T, он должен оставаться таким же, как и он.

На изображении выше, где он говорит о добавлении, это линии, в которых алгоритм перекрывается и должен измениться. У меня вопрос: как сделать так, чтобы, когда алгоритм обнаруживал две разные буквы, он, по сути, перекрывал два отдельных списка для слияния вместе?

Ответы [ 2 ]

3 голосов
/ 19 июня 2020

Вы должны посмотреть на логические операторы. То, что вы делаете, - это операция «или» над парами оснований. Если вы используете numpy, вы можете векторизовать это и значительно ускорить обработку:

original_array = np.array(original)
copy_array = np.array(copy)
oringal_array | copy_array

Результат:

array([[1, 1, 0, 0],
       [0, 0, 1, 0],
       [0, 0, 1, 0],
       [1, 0, 0, 1],
       [0, 1, 1, 0]])

Если вы не хотите использовать numpy, вы все равно можете использовать логические или | со своими списками:

final = []
for o, c in zip(original, copy):
    final.append([x | y for x, y in zip(o, c)])

или

final = [[x | y for x, y in zip(o, c)] for o, c in zip(original, copy)]
1 голос
/ 19 июня 2020

Попробуйте следующее:

import numpy as np

A = [1, 0, 0, 0]
C = [0, 1, 0, 0]
T = [0, 0, 1, 0]
G = [0, 0, 0, 1]
original = [A, T, T, G, C]
copy = [C, T, T, A, T]

x = [1 if 1 in j else 0 for i, v in enumerate(original) for j in zip(v, copy[i])]

new = np.array_split(x, len(original))
print(new)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...