Seite 1 von 1

Listenlänge

Verfasst: Donnerstag 9. September 2004, 11:47
von Stay
Hallo,
hab als Python-Anfänger nur ne simple Frage:
Gibt es denn in Python keinen Befehl, um die Länge der Liste auszugeben, so etwas wie beispielsweise listenname.length oder sowas?
Ich würde nämlich gerne das letzte Element meiner Liste ansprechen ohne einen festen Wert rein zu kodieren.
Danke im Voraus für eure Antworten.
Gruß,
Stay :?

Verfasst: Donnerstag 9. September 2004, 12:10
von fs111
Du suchst len(liste), du kannst aber auch auf den letzten Wert mit dem Index -1 zugreifen:

Code: Alles auswählen

>>> liste = [1,2,3,4,5]
>>> liste[-1]
5
>>> liste = [1,2,3,4,5,6,7,8]
>>> liste[-1]
8
>>>
Grüße fs111

Verfasst: Freitag 19. Oktober 2007, 10:45
von Aquerias
Hallo,

ich habe das mit der len(Liste) ausprobiert und immer eine Fehlermeldung bekommen.

Wo liegt mein Fehler?

Code: Alles auswählen

horsemen = ["war", "famine", "pestilence", "death"]

i = 0
while i < len(horsemen):
print horsemen[i]
i = i + 1
Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "<interactive input>", line 1, in ?
TypeError: 'int' object is not callable
PS. Code ist aus einem Tutorial.

Gruß

Aquerias

Verfasst: Freitag 19. Oktober 2007, 10:56
von keppla
Den Fehler bekommst du nicht mit dem Code, den du gepostet hast (wenn du ihn korrekt einrückst).

Der Fehler "xxx is not callable" kommt meist dadurch, dass man vor einer offenen klammer ein trennzeichen vergisst, z.B. in einer liste:

Code: Alles auswählen

lst = [ 1, (1,2,3) ] #korrekt
lst = [1 (1,2,3) ] # fehler, weil das so aussieht, als würdest du "1" wie eine funktion mit den argumenten 1,2,3 aufrufen wollen
Zu der Schleife möchte ich ausserdem sagen, dass es "unpythonic" ist, per index zu iterieren, cooler und einfacher wäre

Code: Alles auswählen

horsemen = ['war', 'famine', 'death', 'pestilence']
for horseman in horsemen:
  print horseman

Verfasst: Freitag 19. Oktober 2007, 11:18
von Aquerias
Hallo keppla,

danke für die schnelle Antwort,

tut mir leid, aber ich bekomme das nicht hin. Wie muss die Zeile nun ausehen?

So?:

Code: Alles auswählen

while i < len( horsemen ):
oder so?

Code: Alles auswählen

while i < len[ horsemen ]:
Für die Schleife kann ich nichts. Ist ja wie gesagt aus einem Tutorial.

Code: Alles auswählen

horsemen = ['war', 'famine', 'death', 'pestilence']
for horseman in horsemen:
  print horseman
Dieses Schleife ist natürlich um einiges besser. Was mache ich aber wenn ich in einer Liste nur jeden zweiten Wert bearbeiten oder ausgeben möchte? Da bin ich doch auf das iterieren über einen Index angewiesen.

Gruß

Aquerias

Verfasst: Freitag 19. Oktober 2007, 11:25
von Leonidas
Aquerias hat geschrieben:

Code: Alles auswählen

horsemen = ['war', 'famine', 'death', 'pestilence']
for horseman in horsemen:
  print horseman
Dieses Schleife ist natürlich um einiges besser. Was mache ich aber wenn ich in einer Liste nur jeden zweiten Wert bearbeiten oder ausgeben möchte? Da bin ich doch auf das iterieren über einen Index angewiesen.
Nein, du definierst eine Schrittweite:

Code: Alles auswählen

horsemen = ['war', 'famine', 'death', 'pestilence']
for horseman in horsemen[::2]:
  print horseman

Verfasst: Freitag 19. Oktober 2007, 11:26
von Jona
der code funktioniert, keine ahnung wie du damit ein "not callable" hinbekommst.

Code: Alles auswählen

Python 2.5 (r25:51908, Sep 19 2006, 09:52:17) [MSC v.13
Type "help", "copyright", "credits" or "license" for mo
>>> horsemen = ["war", "famine", "pestilence", "death"]
>>>
>>> i = 0
>>> while i < len(horsemen):
...   print horsemen[i]
...   i = i + 1
...
war
famine
pestilence
death
>>>

Code: Alles auswählen

while i < len( horsemen ): #so muss das heissen. len ist eine funktion, die liste ihr parameter
while i < len[ horsemen ]: #hier müsste len ein dict oder eine liste sein ... macht also kein sinn.

Verfasst: Freitag 19. Oktober 2007, 11:26
von BlackJack
Die Fehlermeldung kann man sich auch einhandeln wenn man `len` an eine Zahl bindet:

Code: Alles auswählen

In [507]: len = 42

In [508]: len([1, 2, 3])
---------------------------------------------------------------------------
<type 'exceptions.TypeError'>             Traceback (most recent call last)

/home/bj/<ipython console> in <module>()

<type 'exceptions.TypeError'>: 'int' object is not callable
Das tust Du in dem Quelltext, denn Du gezeigt hast aber nicht.

Jeden zweiten Wert ohne Index bekommst Du mit der Slice-Syntax, dann wird erst eine neue Liste erzeugt, oder mit `itertools.islice()`, das ist "lazy":

Code: Alles auswählen

In [516]: horsemen = ['war', 'famine', 'death', 'pestilence']

In [517]: for horseman in horsemen[::2]:
   .....:     print horseman
   .....:
war
death

In [518]: for horseman in itertools.islice(horsemen, None, None, 2):
   .....:     print horseman
   .....:
war
death

Verfasst: Freitag 19. Oktober 2007, 11:31
von Jona
nutzt ihr

Code: Alles auswählen

liste[::step]
?

wenn ich sowas wirklich mal brauche mache ich das "per hand"... ist mir zu mysteriös, schlecht lesbar.

Verfasst: Freitag 19. Oktober 2007, 11:35
von Rebecca
Die Syntax ist liste[start:stop:schrittweite]. Was ist daran schwer lesbar?

Code: Alles auswählen

>>> a = [1, 2, 3, 4, 5, 6]
>>> a[2]
3
>>> a[2:4]
[3, 4]
>>> a[2:]
[3, 4, 5, 6]
>>> a[:]
[1, 2, 3, 4, 5, 6]
>>> a[::2]
[1, 3, 5]
>>> a[2:6:3]
[3, 6]
Weglassen von start oder stop bedeutet "von Anfang" oder "bis Ende".

Verfasst: Freitag 19. Oktober 2007, 11:38
von Jona
ist schon klar, aber da ich eine von 1 abweichende schrittweite extrem selten benötige mache ich es dann wenn es mal sein muss explizit.
versuche meinen code lesbar zu halten. (ich bin nicht der einzige der den lesen können muss)

Verfasst: Freitag 19. Oktober 2007, 11:40
von BlackJack
Ich nutze das, oder die `islice()`-Alternative. Von Hand ist mir zu umständlich und fehleranfällig.

Verfasst: Freitag 19. Oktober 2007, 12:48
von Aquerias
Vielen Dank für die vielen Antworten,

war echt hilfreich.

Wenn ich nun folgendes eingebe:

Code: Alles auswählen

horsemen = ['war', 'famine', 'death', 'pestilence']

for horseman in itertools.islice(horsemen, None, None, 2):
       print horseman
bekomme ich (wie gewünscht) "war" und "death" ausgegeben.
Wenn ich das richtig verstanden habe wird eine neue Liste mit dem Namen "horseman" erstellt. Wenn ich diese Liste ausgebe bekomme ich allerdings nur den letzten Wert "death".

Wie kann ich vermeiden das in der neuen Liste der "war" mit "death" ersetzt wird?

Gruß

Aquerias

Verfasst: Freitag 19. Oktober 2007, 12:50
von birkenfeld
Offtopic: du solltest deine 4 horsemen mal updaten; Pestilence ist in den 40ern in den Ruhestand gegangen und Pollution hat übernommen.

Verfasst: Freitag 19. Oktober 2007, 12:54
von Aquerias
Danke für den Hinweis, aber ich halte mich lieber an die Originale. :wink:

Verfasst: Freitag 19. Oktober 2007, 13:45
von Leonidas
Aquerias hat geschrieben:

Code: Alles auswählen

horsemen = ['war', 'famine', 'death', 'pestilence']

for horseman in itertools.islice(horsemen, None, None, 2):
       print horseman
bekomme ich (wie gewünscht) "war" und "death" ausgegeben.
Wenn ich das richtig verstanden habe wird eine neue Liste mit dem Namen "horseman" erstellt. Wenn ich diese Liste ausgebe bekomme ich allerdings nur den letzten Wert "death".
itertools.islice() erstellt Generatoren und keine Listen, das ist eben der Unterschied zu der Slice-Syntax. ``print horseman[::2]`` gibt die von dir gewünschten Werte in einer Liste aus.

@Jona: Ich kann es mir nicht vorstellen dass [start:stop:step] zu kompliziert ist.. eine manuelle Variante (wie würdest du die machen) ist meiner Meinung nach komplizierter.