Seite 1 von 1

Wie programmiere ich sowas?

Verfasst: Donnerstag 11. September 2008, 20:25
von __marcus__

Code: Alles auswählen

for result in cursor:
		if result[1] == 0:
			print >>handle_2, '<span class="no">' + result[0] + '</span>' + ' ',
		elif result[1] <= 3:
			print >>handle_2, '<span class="low">' + result[0] + '</span>' + ' ',
		elif result[1] <= 6:
			print >>handle_2, '<span class="medium">' + result[0] + '</span>' + ' ',
		elif result[1] <= 9:
			print >>handle_2, '<span class="high">' + result[0] + '</span>' + ' ',
		else:
			print >>handle_2, '<span class="top">' + result[0] + '</span>' + ' ',	
Ich hab heute das hier geschrieben. Kann man sowas in Python auch in 2-3 Zeilen schreiben??

Re: Wie programmiere ich sowas?

Verfasst: Donnerstag 11. September 2008, 20:43
von Hyperion
ok, hab die classes übersehen.

Verfasst: Donnerstag 11. September 2008, 20:48
von BlackVivi
http://paste.pocoo.org/show/85040/

^___^

Naja, ob das wirklich was bringt... Find deins eigentlich schon schön so :)

Verfasst: Donnerstag 11. September 2008, 21:21
von BlackJack
Keine 2-3 Zeilen, aber nicht so viele Wiederholungen (ungetestet):

Code: Alles auswählen

    classes = ['no', 'low', 'medium', 'high', 'top']
    for row in cursor:
        for limit, cls in ((i * 3, cls) for i, cls in enumerate(classes[:-1])):
            if row[1] <= limit:
                break
        else:
            cls = classes[-1]
    print >>handle_2, '<span class="%s">%s</span> ' % (cls, row[0])
Allerdings solltest Du sicher sein, dass ``row[0]`` nichts enthalten kann, was das HTML kaputt macht. Ausserdem würde ich über ein Templating-System nachdenken.

Verfasst: Freitag 12. September 2008, 07:50
von __marcus__
Danke, für die Tipps, aber ich schätze, es bleibt dann erstmal so "schön"

Verfasst: Freitag 12. September 2008, 13:09
von snafu
Mein Vorschlag:

Code: Alles auswählen

def make_class(res):
	if res == 0:
	    return 'no'
	results = [3, 6, 9]
	classes = {3 : 'low', 6 : 'medium', 9 : 'high'}
	for result in results:
	    if res <= result:
		return classes[result]
	return 'top'

>>> result = ('bla', 4)
>>> print '<span class="%s">%s</span> ' % (make_class(result[1]), result[0])
<span class="medium">bla</span> 

Verfasst: Freitag 12. September 2008, 14:29
von Y0Gi
Mit dem bisect-Modul sollte ich das wirklich auf 3-6 Zeilen runterbrechen lassen. Wer ist mal eben so frei?

Verfasst: Freitag 12. September 2008, 14:52
von Y0Gi
OK, hier mal eine etwas ausführlichere Version:

Code: Alles auswählen

from bisect import bisect_left

classes = (
    ('no', 0),
    ('low', 3),
    ('medium', 6),
    ('high', 9),
    ('top', 100),
    )
# alternativ via `operator.itemgetter`
thresholds = [value for name, value in classes]

for row in cursor:
    index = bisect_left(thresholds, row[1])
    class_name = classes[index][0]
    print >>handle_2, '<span class="%s">%s</span> ' % (class_name, row[0]),
Mit Gewalt bekommt man das aber in drei Zeilen ohne Verwendung eines Semikolons ;)

Code: Alles auswählen

from bisect import bisect_left
classes = (('no', 0), ('low', 3), ('medium', 6), ('high', 9), ('top', 100))
for row in cursor: print >>handle_2, '<span class="%s">%s</span> ' % (classes[bisect_left((value for name, value in classes), row[1])][0], row[0]),