Wert von Liste mit seinem Index multiplizieren

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.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Die list comprehension sieht mit `map` so aus:

Code: Alles auswählen

x = map(int, x.split('.')
Prinzipiell hat man mit `map` keinen Vorteil gegenueber einer List Comprehension, insofern brauchst du nicht tiefer zu graben ;) Sich mit Higher Order Funktionen wie `map` auseinanderzusetzen ist aber nie falsch :)

@ViciousKitty: Das ist genau das was BlackJack meinte, als er sagte "Meide `input()`." ;) (Das gilt natuerlich nur fuer Python2)
Da du scheinbar gerne mit `type` herumspielst, schau dir doch mal an, was `x` nach der 1. Zeile gebunden ist und was fuer einen Typ das hat.
ViciousKitty
User
Beiträge: 8
Registriert: Dienstag 17. Dezember 2013, 13:05

cofi hat geschrieben:Die list comprehension sieht mit `map` so aus:

Code: Alles auswählen

x = map(int, x.split('.')
Prinzipiell hat man mit `map` keinen Vorteil gegenueber einer List Comprehension, insofern brauchst du nicht tiefer zu graben ;) Sich mit Higher Order Funktionen wie `map` auseinanderzusetzen ist aber nie falsch :)

@ViciousKitty: Das ist genau das was BlackJack meinte, als er sagte "Meide `input()`." ;) (Das gilt natuerlich nur fuer Python2)
Da du scheinbar gerne mit `type` herumspielst, schau dir doch mal an, was `x` nach der 1. Zeile gebunden ist und was fuer einen Typ das hat.
Scheinbar ist richtig^^, ich versuche nur die Sachen zu verstehen.
Da kommt dann ein String. Aber überrascht mich jetzt nicht, wenn ich es mit einem String füttere?
elNino
User
Beiträge: 6
Registriert: Dienstag 10. Dezember 2013, 18:30

Das Ursprungsproblem ist gelöst :wink: Das war ne schwere Geburt!
Das ist sicher nicht die Eleganteste Lösung. Aber eine für Beginner verständliche :D

Folgender Algorithmus multipliziert die Elemente einer Eingegebenen Liste mit ihrem Index

Code: Alles auswählen

def MultiIndex(x):
    counter = 0
    listneu =[]
    while x != []:          # Bis die Eingegebene Liste leer ist:
     b = x[0]                # tue in b das ersten Element aus der Liste
     b = counter * b      # Multipliziert das Element mit seinem Index
     del x[0]                 # Lösche das Element aus der Liste
     listneu.append(b)    # Füge das Element zu einer neuen Liste hinzu
     counter = counter + 1
    return listneu

list = input("Gib eine Liste ein: ")    # Gib eine Liste ein
list =[int(i) for i in list.split(',')]      # Konvertiere in integer
list =  MultiIndex (list)                   
print (list)
BlackJack

@elNino: Was daran echt unschön ist, ist das verändern der an `MultiList()` übergebenen Liste. Ineffizient ist es zudem auch noch. Eine ``for``-Schleife über die Liste wäre auch viel einfacher (und wohl auch verständlicher). Und dann kann, wie ja schon gezeigt wurde, das manuelle verwalten von `counter` durch die `enumerate()`-Funktion ersetzt und damit vereinfacht werden.

Und „list comprehensions” kommen in den meisten Einsteigertutorials vor, sind ein wichtiger Bestandteil von Python, und Du verwendest sowieso schon eine. Also ist die ganze Funktion total lang und kompliziert.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

ViciousKitty hat geschrieben:Da kommt dann ein String. Aber überrascht mich jetzt nicht, wenn ich es mit einem String füttere?
Soso ein String? Nur, wenn man auch explizit einen String uebergibt:

Code: Alles auswählen

In [1]: a = input()
"1,2,3,4"

In [2]: b = input()
1,2,3,4

In [3]: type(a), a[0], type(a[0])
Out[3]: (str, '1', str)

In [4]: type(b), b[0], type(b[0])
Out[4]: (tuple, 1, int)
`input()` ist nichts anderes als `eval(raw_input())` und damit eine wunderbare Quelle an Sicherheitsluecken und ueberraschungen:

Code: Alles auswählen

In [5]: input()
Nice try!
  File "<string>", line 1
    Nice try!
           ^
SyntaxError: invalid syntax
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@elNino: Du willst mit jedem Element einer Liste was machen, dann nimm eine for-Schleife:

Code: Alles auswählen

def MultiIndex(x):
    counter = 0
    listneu =[]
    for b in x:
        b = counter * b      # Multipliziert das Element mit seinem Index
        listneu.append(b)    # Füge das Element zu einer neuen Liste hinzu
        counter = counter + 1
    return listneu
dann willst Du zusätzlich einen Zähler, dann nimm enumerate:

Code: Alles auswählen

def MultiIndex(x):
    listneu =[]
    for counter, b in enumerate(x):
        b = counter * b      # Multipliziert das Element mit seinem Index
        listneu.append(b)    # Füge das Element zu einer neuen Liste hinzu
    return listneu
und dann baust Du noch eine neue List auf, dann wandle das ganze in eine List-Comprehension um:

Code: Alles auswählen

def MultiIndex(x):
    return [counter * b for counter, b in enumerate(x)]
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Und halte Dich doch bitte an PEP8! Das ist bestimmt schon erwähnt worden... insbesondere Deine Einrückung ist unschön.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten