einmalige Ausgabe

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
kermicobi
User
Beiträge: 2
Registriert: Samstag 27. März 2021, 23:33

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 :)
Benutzeravatar
darktrym
User
Beiträge: 785
Registriert: Freitag 24. April 2009, 09:26

Indem du die Ausgabe erst am Schluss machst und beim Einlesen in einer Liste sicherst ob die aktuelle sich von der vorherigen unterscheidet.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
kermicobi
User
Beiträge: 2
Registriert: Samstag 27. März 2021, 23:33

und wie kann ich überprüfen ob die antwort sich von der vorherigen unterscheidet?
Benutzeravatar
__blackjack__
User
Beiträge: 14055
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten