Seite 1 von 1

einmalige Ausgabe

Verfasst: Samstag 27. März 2021, 23:41
von kermicobi
Ich arbeite mit einer pdb file!
Ich habe das hier geschrieben:

pdbfile= open(filename,'r')
for pdbline in pdbfile:


if pdbline[0:6] =="ATOM ":
bfac =float(pdbline[60:66])
chainID=(pdbline[21])
resName=(pdbline[17:20])
resSeq=(pdbline[22:26])

if bfac >=55.:
print(chainID,":",resName,"-",resSeq)

Und meine Ausgabe schaut so aus:
A : LYS - 4
A : LYS - 4
A : LYS - 4
A : ASP - 5
A : ASP - 5
A : ASP - 5
A : ASP - 5
A : GLU - 92
A : GLU - 106
A : LYS - 152
A : LYS - 152
A : LYS - 152
A : LYS - 153
A : LYS - 153
A : LYS - 153
A : LYS - 277
A : LYS - 277
A : LYS - 277

Wie kann ich jetzt das so programmieren, dass die zahlen in der dritten Spalte nur einmal ausgegeben werden? Also, dass es keine Wiederholungen gibt?

Ich habe erst mit python angefangen und wäre für jede Hilfe dankbar :)

Re: einmalige Ausgabe

Verfasst: Sonntag 28. März 2021, 12:12
von darktrym
Indem du die Ausgabe erst am Schluss machst und beim Einlesen in einer Liste sicherst ob die aktuelle sich von der vorherigen unterscheidet.

Re: einmalige Ausgabe

Verfasst: Sonntag 28. März 2021, 12:37
von kermicobi
und wie kann ich überprüfen ob die antwort sich von der vorherigen unterscheidet?

Re: einmalige Ausgabe

Verfasst: Sonntag 28. März 2021, 14:22
von __blackjack__
@kermicobi: Dateien sollte man wo es geht mit ``with`` zusammen öffnen, damit die auch garantiert wieder geschlossen werden.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase). Es sollten keine kryptischen Abkürzungen enthalten sein, oder gar der einzige Inhalt eines Namens sein.

Die zusammengehörigen Daten von so einem ATOM-Datensatz könnte man sinnvollerweise zu einem Objekt zusammenfassen.

Wenn man dann das Parsen der Zeilen in eine Generatorfunktion auslagert, kann man `more_itertools.unique_justseen()` verwenden um Läufe von ”gleichen” Werten auszufiltern.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
from collections import namedtuple
from operator import attrgetter

from more_itertools import unique_justseen

ATOM_RECORD_TYPE = "ATOM  "

Atom = namedtuple(
    "Atom", "residue_name chain_id residue_sequence_number temperature_factor"
)


def parse_atom(line):
    if not line.startswith(ATOM_RECORD_TYPE):
        raise ValueError(f"not an atom line: {line!a}")

    return Atom(line[17:20], line[21], int(line[22:26]), float(line[60:66]))


def parse_atoms(lines):
    return (
        parse_atom(line) for line in lines if line.startswith(ATOM_RECORD_TYPE)
    )


def main():
    filename = "test.pdb"

    ...
    
    with open(filename, "r", encoding="ascii") as pdb_file:
        for atom in unique_justseen(
            (
                atom
                for atom in parse_atoms(pdb_file)
                if atom.temperature_factor >= 55
            ),
            key=attrgetter(
                "chain_id", "residue_name", "residue_sequence_number"
            ),
        ):
            print(
                f"{atom.chain_id} :"
                f" {atom.residue_name} - {atom.residue_sequence_number}"
            )


if __name__ == "__main__":
    main()