Ergebnis in Datei schreiben

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.
Chibi
User
Beiträge: 22
Registriert: Samstag 7. November 2009, 12:10

Ok, meint ihr das so? (Ich denke eher nicht, denn das klappt leider nicht.) :(

Code: Alles auswählen

def get_clusters(node, cutoff, parent_is_cluster):
  if node.is_leaf():
    return
  avg=get_average_length(node)
  sum_dist = sum(avg)
  if node.edge.length is not None:
    sum_dist -= get_num_leaf_nodes(node, 0)*node.edge.length
  real_dist = sum_dist/get_num_leaf_nodes(node, 0)
  if real_dist <= cutoff and not parent_is_cluster:
    yield ""
    yield real_dist
    yield taxon_names(node)
  elif real_dist > cutoff:
    for n in node.child_nodes():
      get_clusters(n, cutoff, False)
 


cutoff=float(raw_input("Enter Cutoff value: "))

get_clusters(t1.seed_node, cutoff, False) 

for value in get_clusters(n, cutoff, False):
    yield value


Mhh, ich bin in dem Punkt grad n bischen doof, könntet ihr mir das an meinem Code zeigen. Ich verzeifel so langsam

P.S.Achso, ich benutze Python 2.5, also das with statement würde nicht gehen
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Chibi hat geschrieben: Mhh, ich bin in dem Punkt grad n bischen doof, könntet ihr mir das an meinem Code zeigen. Ich verzeifel so langsam
Wieso beharrst Du so auf den Generatoen? sma hat Dir doch sogar ein Code Snippet gezeigt, wie man ein File Objekt an eine Funktion übergibt und Werte dort reinschreibt!
Chibi hat geschrieben: P.S.Achso, ich benutze Python 2.5, also das with statement würde nicht gehen

Code: Alles auswählen

from __future__ import with
Man kann natürlich auch auf with verzichten und mit einem geeigneten try...except...finally Konstrukt arbeiten - aber with ist einfacher ;-)
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

@Hyperion Du hast ein _statement vergessen ;) ``from __future__ import with_statement``
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@derdon:

Deine `dummy_generator`-Beispiele lassen sich auch so schreiben:

Code: Alles auswählen

>>> from itertools import repeat
>>> list(repeat((1,2,3), 10))
[(1, 2, 3), (1, 2, 3), (1, 2, 3), (1, 2, 3), (1, 2, 3), (1, 2, 3), (1, 2, 3), (1, 2, 3), (1, 2, 3), (1, 2, 3)]
>>> for tpl in repeat(('hallo','welt','alles klar?'), 10): print tpl
... 
('hallo', 'welt', 'alles klar?')
('hallo', 'welt', 'alles klar?')
('hallo', 'welt', 'alles klar?')
('hallo', 'welt', 'alles klar?')
('hallo', 'welt', 'alles klar?')
('hallo', 'welt', 'alles klar?')
('hallo', 'welt', 'alles klar?')
('hallo', 'welt', 'alles klar?')
('hallo', 'welt', 'alles klar?')
('hallo', 'welt', 'alles klar?')
In Python 3.x geht dann zum Glück auch:

Code: Alles auswählen

>>> from functools import partial
>>> ten_times = partial(repeat, times=10)
>>> list(ten_times('bla'))
['bla', 'bla', 'bla', 'bla', 'bla', 'bla', 'bla', 'bla', 'bla', 'bla']
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

DasIch hat geschrieben:@Hyperion Du hast ein _statement vergessen ;) ``from __future__ import with_statement``
Schande über mich ;-)
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

snafu: Es ging mir nur darum, dem TE zu zeigen, wie man eigene Generatoren definieren kann. das Modul itertools ist mir bekannt.
Chibi
User
Beiträge: 22
Registriert: Samstag 7. November 2009, 12:10

Sooo, musste leider die letzte zeit viel arbeiten, hab mich aber jetzt nochmal ans Programm gesetzt und mit frischem Blick und einer Pause, hab ichs endlich hinbekommen, nicht die hübscheste Lösung aber dank euch klappt jetzt alles wie ichs will.

Hier ma der Code:

Code: Alles auswählen


....
def get_clusters(node, cutoff, parent_is_cluster):
  if node.is_leaf():
    return
  avg=get_average_length(node)
  sum_dist = sum(avg)
  if node.edge.length is not None:
    sum_dist -= get_num_leaf_nodes(node, 0)*node.edge.length
  real_dist = sum_dist/get_num_leaf_nodes(node, 0)
  if real_dist <= cutoff and not parent_is_cluster:

    fobj = open("Outfile.txt", "a")
    
    print >> fobj, "Transmissionscluster:"
    print >> fobj, ""
    print >> fobj, real_dist
    print >> fobj, taxon_names(node)
    print >> fobj, "\n"
    print >> fobj, "\n"
	
	
  elif real_dist > cutoff:
    for n in node.child_nodes():
      get_clusters(n, cutoff, False)
      

cutoff=float(raw_input("Enter Cutoff value: "))

get_clusters(t1.seed_node, cutoff, False)

fobj.close()

Jetzt würd ich gerne noch ein paar Schönheitsoperationen hinsichtlich der Ausgabe vollziehen.

Mein Ergebniss sehen so aus:

bla
1.12345
['A.BC.DE', '12_345']

bla
3.45678
['F.GH.IJ', '67_890']

bla
0.00000
['A.AA.AA', '00_000']

...

Ich würd gerne noch, dass er mir anstatt nur bla
1.bla
1.12345
['A.BC.DE', '12_345']

2.bla
3.45678
['F.GH.IJ', '67_890']

3.bla
0.00000
['A.AA.AA', '00_000']

und so weiter in Textdatei schreibt. Also die bla durchnummeriert

Kann mir da nochmal jemand eine guten Tipp geben, wie ich das am besten realisieren kann?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Da das ganze ja rekursiv abläuft müßtest Du einen Zähler durchreichen, den Du hochzählst.
Chibi
User
Beiträge: 22
Registriert: Samstag 7. November 2009, 12:10

Aha, könntest du mir das bitte genauer erklären. Was meinst du mit "durchreichen"?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Na, Du gibst doch in get_clusters diese Dinge aus, richtig? Dann musst Du auf jeder Rekursionsebene wissen, wie Dein Zähler grad aussieht. Also musst Du ihn als Parameter bei jedem rekursiven Aufruf mit angeben und dann innerhalb der Funktion entsprechend der Ausgaben erhöhen.
Antworten