Seite 1 von 2

Verfasst: Samstag 6. März 2010, 13:43
von Chibi
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

Verfasst: Samstag 6. März 2010, 13:50
von Hyperion
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 ;-)

Verfasst: Samstag 6. März 2010, 13:51
von DasIch
@Hyperion Du hast ein _statement vergessen ;) ``from __future__ import with_statement``

Verfasst: Samstag 6. März 2010, 14:01
von snafu
@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']

Verfasst: Samstag 6. März 2010, 14:16
von Hyperion
DasIch hat geschrieben:@Hyperion Du hast ein _statement vergessen ;) ``from __future__ import with_statement``
Schande über mich ;-)

Verfasst: Samstag 6. März 2010, 15:11
von derdon
snafu: Es ging mir nur darum, dem TE zu zeigen, wie man eigene Generatoren definieren kann. das Modul itertools ist mir bekannt.

Verfasst: Montag 15. März 2010, 21:15
von Chibi
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?

Verfasst: Montag 15. März 2010, 21:30
von Hyperion
Da das ganze ja rekursiv abläuft müßtest Du einen Zähler durchreichen, den Du hochzählst.

Verfasst: Montag 15. März 2010, 21:44
von Chibi
Aha, könntest du mir das bitte genauer erklären. Was meinst du mit "durchreichen"?

Verfasst: Montag 15. März 2010, 21:56
von Hyperion
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.