Listenlänge

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
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 :?
fs111
User
Beiträge: 170
Registriert: Samstag 15. November 2003, 11:42
Kontaktdaten:

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
Pydoc-Integration in vim - Feedback willkommen: http://www.vim.org/scripts/script.php?script_id=910
Aquerias
User
Beiträge: 28
Registriert: Freitag 28. September 2007, 10:33

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
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

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
Aquerias
User
Beiträge: 28
Registriert: Freitag 28. September 2007, 10:33

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Jona
User
Beiträge: 94
Registriert: Sonntag 23. September 2007, 23:25

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.
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
Jona
User
Beiträge: 94
Registriert: Sonntag 23. September 2007, 23:25

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.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

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".
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Jona
User
Beiträge: 94
Registriert: Sonntag 23. September 2007, 23:25

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)
BlackJack

Ich nutze das, oder die `islice()`-Alternative. Von Hand ist mir zu umständlich und fehleranfällig.
Aquerias
User
Beiträge: 28
Registriert: Freitag 28. September 2007, 10:33

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
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Offtopic: du solltest deine 4 horsemen mal updaten; Pestilence ist in den 40ern in den Ruhestand gegangen und Pollution hat übernommen.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Aquerias
User
Beiträge: 28
Registriert: Freitag 28. September 2007, 10:33

Danke für den Hinweis, aber ich halte mich lieber an die Originale. :wink:
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten