Wie programmiere ich sowas?

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
__marcus__
User
Beiträge: 92
Registriert: Mittwoch 10. September 2008, 22:10
Wohnort: Hamburg

Donnerstag 11. September 2008, 20:25

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??
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Donnerstag 11. September 2008, 20:43

ok, hab die classes übersehen.
Zuletzt geändert von Hyperion am Donnerstag 11. September 2008, 20:51, insgesamt 1-mal geändert.
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Donnerstag 11. September 2008, 20:48

http://paste.pocoo.org/show/85040/

^___^

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

Donnerstag 11. September 2008, 21:21

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.
__marcus__
User
Beiträge: 92
Registriert: Mittwoch 10. September 2008, 22:10
Wohnort: Hamburg

Freitag 12. September 2008, 07:50

Danke, für die Tipps, aber ich schätze, es bleibt dann erstmal so "schön"
Benutzeravatar
snafu
User
Beiträge: 5461
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Freitag 12. September 2008, 13:09

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> 
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Freitag 12. September 2008, 14:29

Mit dem bisect-Modul sollte ich das wirklich auf 3-6 Zeilen runterbrechen lassen. Wer ist mal eben so frei?
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Freitag 12. September 2008, 14:52

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]),
Antworten