문제의 두 부분이있는 것 같습니다. 첫 번째는 DNA 서열을 여러 번 돌연변이시키고 자하는 것이고, 두 번째는 어떤 종류의 데이터 구조에서 돌연변이에 대한 추가 정보를 수집하고자한다는 것입니다. 나는 그것들을 각각 처리 할 것이다.
동일한 소스 문자열에서 100 개의 임의 결과를 생성하는 것은 매우 쉽습니다. 경우, 물론
results = [mutate(original_string) for _ in range(100)]
: 당신은 (발전기 기능에, 예를 들어) 명시 적 루프와 함께 할 수 있지만, 당신은 쉽게 이상 단일 돌연변이 기능을 실행하기 위해 지능형리스트를 사용할 수 있습니다 이상 mutate
함수를 더 복잡하게 만들면이 간단한 코드가 적합하지 않을 수 있습니다. 단순한 문자열이 아닌 좀 더 정교한 데이터 구조를 반환하는 경우 원하는 형식으로 데이터를 결합하기 위해 추가 처리가 필요할 수 있습니다.
이러한 데이터 구조를 작성하는 방법에 대해서는 이미 코드를 작성하는 것이 좋습니다. 데이터에 얼마나 정확하게 액세스 할 것인지 결정한 다음 올바른 유형의 컨테이너로 안내 할 수 있어야합니다.
예를 들어 문자열에 일어나는 모든 돌연변이에 대한 간단한 기록 만 갖고 싶다면 돌연변이 전후의 기본 튜플을 포함하는 기본 목록을 제안 할 수 있습니다. 반면에 주어진베이스가 무엇에 대해 변이되는지를 효율적으로 찾을 수 있기를 원한다면 목록을 값으로 갖는 사전이 더 적절할 수 있습니다. 원한다면 돌연변이 된 염기의 색인을 포함시킬 수도 있습니다.
이
bases = "ACGT"
def mutate(orig_string, mutation_rate=0.0066):
result = []
mutations = []
for base in orig_string:
if random.random() < mutation_rate:
new_base = bases[bases.index(base) - random.randint(1, 3)] # negatives are OK
result.append(new_base)
mutations.append((base, new_base))
else:
result.append(base)
return "".join(result), mutations
이 코드의 가장 까다로운 비트가 나는의 교체를 따기 해요 방법은 다음과 같습니다
여기에 모든 돌연변이를 기록 튜플의 목록과 함께 돌연변이 문자열을 반환하는 함수에 잠깐 시도이다 현재의베이스. 표현 bases[bases.index(base) - random.randint(1, 3)]
은 모두 한 번에 수행합니다. 다른 비트를 분해 할 수 있습니다. bases.index(base)
은 코드 상단에있는 전역 bases
문자열의 이전 기본 인덱스를 제공합니다. 그런 다음이 인덱스 (random.randint(1, 3)
)에서 임의의 오프셋을 뺍니다. 새 인덱스는 음수 일 수 있지만 괜찮 으면 bases
문자열 (bases[...]
)으로 다시 인덱스 할 때 음수 인덱스는 왼쪽이 아닌 오른쪽에서 계산됩니다.하나 이상의 돌연변이를 얻을 매우 가능성이있어 "ATGT"
처럼 짧은 문자열에 대한
string = "ATGT"
results = [mutate(string) for _ in range(100)]
for result_string, mutations in results:
if mutations: # skip writing out unmutated strings
print(result_string, mutations)
을, 심지어 사람은 매우 드문 : 여기
당신이 그것을 사용할 수있는 방법입니다. 위의 루프는 각 실행에서 2와 4 개의 결과를 인쇄하는 경향이 있습니다 (즉, 길이의 4 분의 95 이상이 4 개의 문자열이 전혀 변경되지 않았습니다). 긴 문자열은 돌연변이가 더 자주 발생하므로 하나의 문자열에 여러 개의 돌연변이가 표시됩니다.
사전에 포함 할 내용을 조금 더 자세하게 설명 할 수 있습니까? 돌연변이가 발생한 색인 목록을 유지하는 것처럼 보이지만 더 많이 원하는 것처럼 보입니다. – Blckknght
나는 사전에 키가 원래베이스가되도록하고 값은 변형 된베이스가되도록하고 싶습니다. 예를 들어, "ATGT"와 같이 보이는 원본 가닥이 있고 다음과 같은 변형 된 가닥이있는 경우 : "AGTT",이 가닥의 사전을 {T : G, G : T} – user3670902
모든 상황을 처리 할 수 있는지 잘 모르겠습니다. 동일한베이스를 여러 번 다른 값으로 변경할 수 있습니다. 어떻게 처리해야합니까? 내가 생각하기에 사전이 아닌'from, to' 튜플의 목록을 제공하기는 쉽습니다. – Blckknght