Listenfrage

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
sebastian12
User
Beiträge: 10
Registriert: Mittwoch 4. März 2009, 12:10

Hallo, wieder eine Anfängerfrage.
Ich definiere eine Liste z.B.:
liste = [a,b],
a und b sind Zahlen. Mit a, b führe ich math. Operationen durch
und will die Ergebnisse in dieser Liste unterbringen, z.B. an der
x-ten Stelle, x > listenplatz(b)+1. Wenn ich das mit:
"liste.insert (x,Ergebnis)"
mache wird das eingefügte Element aber direkt hinter "b" gesetzt.
Gibt's da eine Möglichkeit?
Danke
Sebastian
BlackJack

@sebastian12: Du müsstest halt schon eine entsprechend grosse Liste verwenden. Python kann ja schlecht erraten was in den Plätzen zwischen `b` und dem neuen Element eingefügt werden soll. Ansonsten könntest Du auch über ein Dictionary nachdenken.
sebastian12
User
Beiträge: 10
Registriert: Mittwoch 4. März 2009, 12:10

BlackJack hat geschrieben:@sebastian12: Du müsstest halt schon eine entsprechend grosse Liste verwenden. Python kann ja schlecht erraten was in den Plätzen zwischen `b` und dem neuen Element eingefügt werden soll. Ansonsten könntest Du auch über ein Dictionary nachdenken.
Naja, ich weiß nicht im vorraus, wie lange ich die Liste sein soll.
Ich dachte, es gäbe die Möglichkeit variabler Listenlänge.
Sonst gucke ich mir Dictionarys mal an.
Danke BlackJack
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

sebastian12 hat geschrieben:Ich dachte, es gäbe die Möglichkeit variabler Listenlänge.
Die Listenlänge ist ja variabel.
sebastian12
User
Beiträge: 10
Registriert: Mittwoch 4. März 2009, 12:10

Aber, wie in meinem 1. Post geschrieben, wird der neue Eintrag
direkt hinter den letzten gesetzt und nicht 2 Stellen weiter, wenn ich das will.
cz3kit
User
Beiträge: 74
Registriert: Freitag 9. Januar 2009, 16:24

also wenn du das neue element einfach an das ende der liste dranhängen willst, kannst du append verwenden

Code: Alles auswählen

mylist = [a, b]
c = a + b
mylist.append(c)
print mylist
>>> [a, b, c]
so in etwa würde das aussehen
sebastian12
User
Beiträge: 10
Registriert: Mittwoch 4. März 2009, 12:10

@cz3kit
nein, das wollte ich nicht.
Das neue Element soll paar Listenplätze weiter hinten gesetzt werden.
Aber nach der Antwort von BlackJack habe ich das Problem verstanden.
Danke
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Listen haben keine Lücken. Jeder Index, vom ersten bis zum letzten, hat einen Wert. Wenn du eine Liste mit zwei Elementen hast und an fünfter Stelle ein neues Element einfügen willst, musst du den Zwischenraum irgendwie füllen.

Besser ist es allerdings, bei solchen Problemen ein dict() zu nehmen oder seinen Ansatz nochmal komplett zu überdenken. Warum muss Eingabe und Ergebnis in der selben Liste stehen?
sebastian12
User
Beiträge: 10
Registriert: Mittwoch 4. März 2009, 12:10

[quote="Defnull"]Listen haben keine Lücken. Jeder Index, vom ersten bis zum letzten, hat einen Wert. Wenn du eine Liste mit zwei Elementen hast und an fünfter Stelle ein neues Element einfügen willst, musst du den Zwischenraum irgendwie füllen.

wie gesagt ,verstanden.

Es geht um Polynome, die verändert werden.
Auf Grund der Algorithmusstruktur ist es praktikabler, immer die
selbe Liste, Dictionary... was auch immer zu nehmen
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Es geht um Polynome, die verändert werden.
Dann füll doch die Zwischenräume mit Nullen auf. Das entspricht dann auch der üblichen Darstellung von Polynomen als Vektor. Also:

Code: Alles auswählen

6x**4 + x**3 + 4x + 2
[6, 1, 0, 4, 2]
sebastian12
User
Beiträge: 10
Registriert: Mittwoch 4. März 2009, 12:10

@HerrHagen
Das ist mir schon klar.
Wenn deg (f) = n, deg (f^2) = 2n.
Also doppelte Listenlänge. Da ich im Vorraus nicht weiß,
wie viele Operationen zu machen sind, kann ich die Listenlänge
nicht im Vorraus definieren.
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Ich versteh zwar nicht so recht was du meinst, aber die Listenlänge ist variabel.
Listen haben nur keine eingebaute Methode um Objekte an einer Position größer ihrer eigenen Länge einzufügen und die "Lücken" mit einem anderen Objekt aufzufüllen.
Aber es hindert dich ja nichts daran, eine Klasse zu schreiben, die von list erbt oder intern eine Liste nutzt und diese Funktionalität entsprechend implementiert.
sebastian12
User
Beiträge: 10
Registriert: Mittwoch 4. März 2009, 12:10

Jetzt verstehe ich nichts.
Ich bin ein Anfänger. Ich dachte halt, ich könnte die Liste
"größer" machen, falls Bedarf.
Ich überlege mir was anderes .
Danke
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Du kannst sie ja auch bei Bedarf größer machen. Das Listenobjekt hat nur keine Methode die genau das macht, was du haben willst.
Du kannst dir aber leicht selber eine Funktion dafür bauen:

Code: Alles auswählen

def insert_plus(list_obj, index, obj, fill=0):
    if index <= len(list_obj):
        list_obj.insert(index, obj)
    else:
        list_obj.extend([fill] * (index - len(list_obj) + 1))
        list_obj[index] = obj

Code: Alles auswählen

>>> x=[0, 1, 2]
>>> insert_plus(x, 7, "7")
>>> x
[0, 1, 2, 0, 0, 0, 0, '7']
(Man sollte so etwas besser als Methode einer Klasse umsetzten, ich wollte es aber so simpel wie möglich halten)

MFG HerrHagen
sebastian12
User
Beiträge: 10
Registriert: Mittwoch 4. März 2009, 12:10

@HerrHagen
So was brauche ich. Danke
Ich verstehe zwar nicht, was da passiert
aber ich werd's herausfinden
Danke
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Da kann man noch einen Fall einsparen:

Code: Alles auswählen

def insert_plus(list_obj, index, obj, fill=0):
    if index >= len(list_obj):
        list_obj.extend([fill] * (index - len(list_obj) + 1))
    list_obj[index] = obj
Edit: Ach, da kann man alle Fälle einsparen:

Code: Alles auswählen

def insert_plus(list_obj, index, obj, fill=0):
    list_obj.extend([fill] * (index - len(list_obj) + 1))
    list_obj[index] = obj
Das Leben ist wie ein Tennisball.
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Nicht wenn das usprüngliche Verhalten beibehalten werden soll.
Deine Variante überschreibt das Objekt mit dem Index (also eher ein setitem_plus).

Code: Alles auswählen

>>> x = [0,1,2]
>>> insert_plus(x, 0, "X")
>>> x
['X', 1, 2]
In der usprünglichen Variante wurde das Objekt eingefügt:

Code: Alles auswählen

>>> x = [0,1,2]
>>> insert_plus(x, 0, "X")
>>> x
['X', 0, 1, 2]
MFG HerrHagen
Antworten