Liste an Cheetah übergeben ?

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
debian75
User
Beiträge: 90
Registriert: Dienstag 27. November 2007, 01:05

moin

ich möchte eine liste an ein cheetah.tmpl übergeben. leider bekomme ich einen "IndexError: string index out of range" error. template.title geht, aber die liste nicht.

Code: Alles auswählen

li = []
li.append('1')
li.append('2')
etc...

template.title ="Hello World"
template.li = li
return str(template)

Code: Alles auswählen

<table>
<tr>
<b>$title</b
<br>
#for $s in $li
<td><img src='$s[0]'></td>
<td valign='top'>$s[1]<br>
Broschiert<br>
Name: $s[2]<br>
Vorname: $s[3]<br>
</td>
#end for
</tr>
</table>
#end block main
BlackJack

Das hat nichts mit Listen oder Cheetah zu tun. Folgender halbwegs äquivalenter, reiner Python-Code hat genau das gleiche Problem:

Code: Alles auswählen

li = ['1', '2', '3']
for s in li:
    print s[0]
    print s[1]
Eine Zeichenkette der Länge 1 hat eben kein zweites Zeichen -> `IndexError`.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

debian75 hat geschrieben:

Code: Alles auswählen

li = []
li.append('1')
li.append('2')
template.li = li
return str(template)

Code: Alles auswählen

#for $s in $li
  <td><img src='$s[0]'></td>
  <td valign='top'>$s[1]<br>
#end for
Hallo debian75!

``#for $s in $li`` geht jeden Eintrag der Liste durch.

Deine Liste sieht so aus: ``['1', '2', '3']``

Ein Eintrag sieht dann so aus: ``'1'``

Du kannst zwar mit ``$s[0]`` das erste Zeichen dieses Listeneintrages heraus holen, aber ein ``$s[1]`` gibt den Fehler, da in diesem String kein zweites Zeichen drinnen ist.

Du müsstest deine Liste so befüllen:

Code: Alles auswählen

li = []
li.append(('http://hallo.xx/image1.jpg', 'Das ist ein Bild'))
li.append(('http://hallo.xx/image2.jpg', 'Das ist noch ein Bild'))
Diese Liste würde dann so aussehen:

Code: Alles auswählen

[
    ('http://hallo.xx/image1.jpg', 'Das ist ein Bild'),
    ('http://hallo.xx/image2.jpg', 'Das ist noch ein Bild'),
]
Dann kannst du auch mit ``$s[0]`` und ``$s[1]`` auf die beiden Einträge zugreifen.

mfg
Gerold
:-)
Zuletzt geändert von gerold am Dienstag 4. Dezember 2007, 10:34, insgesamt 1-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
debian75
User
Beiträge: 90
Registriert: Dienstag 27. November 2007, 01:05

hallo gerold,

das wunder mit etwas, weil wenn ich in der konsole print li[0] mache, dann printet er mir nicht nur einen buchstaben, sondern das ganze wort.

im prinzip will ich sowas wie nen array

Code: Alles auswählen

li = ['hallo', 'ich', 'bin', 'ein', 'array']

print li[0] ergibt --> hallo
print li[1] ergibt --> ich
etc...

ich bin sicher mit deinem vorlschlag bekomm ich das irgendwie hin.
naja, mal rumspielen wenn ich heim komme.

thnx und gruss
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

debian75 hat geschrieben:

Code: Alles auswählen

li = ['hallo', 'ich', 'bin', 'ein', 'array']

print li[0] ergibt --> hallo
print li[1] ergibt --> ich
Hallo debian75!

Aber du machst ja das hier:

Code: Alles auswählen

li = ['hallo', 'ich', 'bin', 'ein', 'array']

for s in li:
    print s[0] # ergibt: "h" und nicht "hallo"
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Jan-Peer
User
Beiträge: 166
Registriert: Dienstag 2. Oktober 2007, 10:55

Noch deutlicher: Du hast da ein Verständnisproblem bezüglich der for-Schleife:

for s in li heißt nichts anderes, als das er `s` bei jedem Durchlauf das nächste Element der Liste zuweist.

Was du zu konstruieren versucht hast (wie man es ja aus anderen Sprachen kennt) wäre ein Laufindex über der Länge der Liste, in Python folgendermaßen zu lösen:

Code: Alles auswählen

for i in range(len(li)):
    print li[i]
BlackJack

Wobei man letzteres nicht machen sollte, da unnötig komplex.
Antworten