Wie kann ich das folgende Programm ändern, damit ich sicher bin, dass jeder Brief, den es ersetzt, eindeutig ist?

Ich schrieb ein Programm, das eine Liste von 3-Buchstaben-Strings (auch Codons genannt wird, für diejenigen, die Biologie kennen) und für jede Saite, wird es eine der 3 Buchstaben (zufällig) auswählen und wird diesen Brief mit dem A, G, C oder T (zufällig). Zum Beispiel: Für den String GCT, wird es eine der 3 Positionen zufällig dh C, und dann wird es zufällig ändern, entweder A, G, C oder T ie T. So die neue Zeichenfolge (oder Codon) Generiert wird GTT, und so weiter für die nächste Zeichenfolge auf der Liste.

Allerdings gibt es ein Problem. Die Art, wie ich es geschrieben habe, überprüft nicht, um sicherzustellen, dass der neue String, den es erzeugt, nicht derselbe ist wie der alte. Also, wenn das Programm zufällig wählt, um einen Brief an die gleiche als initial zu ändern, dann wird es die gleiche Zeichenfolge zufällig, dh das Umschalten der C aus GCT in ein C wieder und produzieren GCT. Ich möchte sicherstellen, dass dies nicht passiert, so dass das Programm nicht die gleiche Zeichenfolge erzeugt, denn dies geschieht durch zufällige Chance bei der Analyse von Hunderten von Tausenden dieser Codons / Strings. Ich habe versucht, dies zu tun, indem ich die Liste (A, G, T, C) – Codon [Index] in der zweiten Zeile meiner "für" Schleife, aber es hat nicht funktioniert.

Ich werde dich nicht mit dem ganzen Code belästigen, aber anfangs habe ich gerade die Akte geöffnet, in der meine Codons / Strings aufgeführt sind (in einer Spalte) und sie alle in eine Liste angehängt und nannte sie 'codon'. Hier ist der Rest:

import random def string_replace(s,index,char): return s[:index] + char + s[index+1:] for x in range(1,10): # I set the range to 10 so that I can manually check if the program worked properly index = random.randrange(3) letter_to_replace = random.choice(list({"A", "G", "T", "C"} - {codon[index]})) mutated_codon = [string_replace(codon[x], index, letter_to_replace)] print mutated_codon) 

5 Solutions collect form web for “Wie kann ich das folgende Programm ändern, damit ich sicher bin, dass jeder Brief, den es ersetzt, eindeutig ist?”

 - {codon[index] 

-> das wird ein 3-Buchstaben-Code sein, wenn Codon eine Liste von 3 Buchstaben-Strings ist, den du glaubst, dass du Codon [x] [Index]

Bearbeiten Sie die Funktion, um Ihr Codonset dort zu haben, eher dann nach unten, geben Sie Indizes, um dort zu ersetzen, ich weiß nicht, wie Sie eine Liste von Codons erstellen werden, aber hier habe ich ein Beispiel

 listofcodons=["ATC", "AGT", "ACC"] for s in listofcodons: index=random.randrange(3) mutated=string_replace(s,index) print mutated def string_replace(s,index): codonset=set(["A","C","G","T"]) toreplace=s[index] #codonset.pop(toreplace) codonset.remove(toreplace) char=random.choice(codonset) return s[:index] + char + s[index+1:] 

So war es mir langweilig und beschlossen, Golf zu kodieren (könnte kürzer sein, war aber hier zufrieden).

 from random import choice as c a=['ACT','ATT','GCT'] # as many as you want f=lambda s,i:s[:i]+c(list(set(['A','G','C','T'])-set(s[i])))+s[i+1:] b=[f(s,c([0,1,2]))for s in a] print b 

a kann deine Liste von Codons sein und b wird eine Liste von Codons mit einem zufälligen Index durch einen zufälligen (nie das gleiche) Schreiben ersetzt werden.

Ok, um deine neue Frage zu beantworten:

 from random import choice as c codons = ['ACT','ATT','GCT'] f=lambda s,i:s[:i]+c(list(set(['A','G','C','T'])-set(s[i])))+s[i+1:] mutated_codons = [f(s,c([0,1,2]))for s in codons] for codon in mutated_codons: try: print codon, codon_lookup[codon] except KeyError, e: print e 

Angenommen, Ihr Wörterbuch heißt condon_lookup , dies wird jedes mutierte Codon gefolgt von seiner Aminosäure Lookup. Ihr alter Code schlug über die Buchstaben in jedem mutierten Codon, anstatt durch eine Liste von Codons wie Sie beabsichtigt zu schleifen.

Sie könnten eine while-Schleife verwenden:

 import random mutated_codon=codon='GCT' while mutated_codon==codon: li=list(mutated_codon) li[random.choice([0,1,2])]=random.choice(["A", "G", "T", "C"]) mutated_codon = ''.join(li) print codon, mutated_codon 

Wie wäre es mit so etwas?

 #!/usr/local/cpython-3.3/bin/python import random def yield_mutated_codons(codon): possible_set = set({"A", "G", "T", "C"}) for x in range(1, 10): index = random.randrange(3) letter_to_replace = codon[index] current_set = possible_set - set(letter_to_replace) codon[index] = random.choice(list(current_set)) yield ''.join(codon) def main(): codon = list('GAT') for mutated_codon in yield_mutated_codons(codon): print(mutated_codon) main() 
  • Wie wählen Sie "x" Anzahl der eindeutigen Zahlen aus einer Liste in Python?
  • Generiere 'n' eindeutige Zufallszahlen innerhalb eines Bereichs [doppelte]
  • Python entfernen Sie ein Element aus einer zufälligen Liste, nachdem sie ausgewählt wurden
  • Gewichtete Stichprobe in Python
  • Was ist der beste Weg, um zufällige Strings einer bestimmten Länge in Python zu generieren?
  • Warum dieses python-programm funktioniert nicht
  • Kommissioniere ein zufälliges Wort in Python?
  • (Pseudo) Zufallszahlenerzeugung in Python ohne Verwendung von Modulen und Uhr
  • Python - gleiche Zufallszahlen erzeugen
  • Python-Zufallssequenz mit Samen
  • Zufallszahl im Bereich 1 bis sys.maxsize ist immer 1 mod 2 ^ 10
  • Python ist die beste Programmiersprache der Welt.