Seite 1 von 1

Addition von Parametern in einem Tupel

Verfasst: Sonntag 13. April 2014, 13:11
von duodiscus
Hallo miteinander,
ich habe nun eine Liste erstellt, in der 3 jeweils 2-Tupel enthalten sind mit dem Namen der Firma und der Mitarbeiterzahl:

Code: Alles auswählen

liste = [ ('Firma A', 25) , ('Firma B', 60) , ('Firma C', 70) ]
Wie, muss ich jetzt eine for Schleife bauen, das der mir die Mitarbeiter zusammen addiert? Wie kann man ihm sagen, das er nur die Zahlen daraus nehmen soll?

Re: Addition von Parametern in einem Tupel

Verfasst: Sonntag 13. April 2014, 13:17
von BlackJack
@duodiscus: Brich das Problem auf kleinere Teilprobleme herunter. Wenn Du *ein* Tupel hast, dann weisst Du doch sicher wie Du das zweite Element daraus holen kannst.

Re: Addition von Parametern in einem Tupel

Verfasst: Sonntag 13. April 2014, 13:25
von duodiscus
Wenn ich ein Tupel habe:

Code: Alles auswählen

tupel = ('Firma A' , 25)

>>> tupel[1]
25
So würde ich ein einziges zugreifen und ein Element herausholen. Allerdings stehen die bei meiner Aufgabe ja in einer Liste und es muss mit einer for Schleife gelöst werden.

Auf Listen beispielsweise so:

Code: Alles auswählen

>>> liste
[('Firma B', 25), ('Firma C', 40)]
>>> liste[1]
('Firma C', 40)

Re: Addition von Parametern in einem Tupel

Verfasst: Sonntag 13. April 2014, 13:50
von fail

Code: Alles auswählen

>>> liste =[('Firma B', 25), ('Firma C', 40)]
>>> liste[1]
('Firma C', 40)
>>> liste[1][1]
40

Re: Addition von Parametern in einem Tupel

Verfasst: Sonntag 13. April 2014, 13:52
von derdon
for-Schleife? Welche for-Schleife? :P

Code: Alles auswählen

In [2]: liste = [("Firma A", 25), ("Firma B", 60), ("Firma C", 70)]

In [3]: from operator import itemgetter

In [4]: snd = itemgetter(1)

In [5]: sum(map(snd, liste))
Out[5]: 155
Edit: ``itertools.imap`` wäre hier schöner weil speicherschonender.

Re: Addition von Parametern in einem Tupel

Verfasst: Sonntag 13. April 2014, 13:57
von Hyperion

Code: Alles auswählen

In [4]: snd = itemgetter(1)
``snd`` für ``second``... fauler Sack :mrgreen:

Re: Addition von Parametern in einem Tupel

Verfasst: Sonntag 13. April 2014, 14:02
von derdon
Hyperion: Ich hab mich da von Haskell inspirieren lassen:

Code: Alles auswählen

Prelude> let liste = [("Firma A", 25), ("Firma B", 60), ("Firma C", 70)]
Prelude> sum $ map snd liste
155

Re: Addition von Parametern in einem Tupel

Verfasst: Sonntag 13. April 2014, 14:05
von cofi
Generatorausdruecke passen hier prima :)

Code: Alles auswählen

In [5]: firmen = [("Firma A", 25), ("Firma B", 60), ("Firma C", 70)]

In [6]: sum(firma[1] for firma in firmen)
Out[6]: 155
Und zu deiner urspruenglichen Aufgabe "Wie kann man ihm sagen, das er nur die Zahlen daraus nehmen soll?":

Code: Alles auswählen

In [7]: sum(sum(attr for attr in firma if isinstance(attr, (int, float))) for firma in firmen)
Out[7]: 155
Das ist aber mit Vorsicht zu geniessen ;)

Re: Addition von Parametern in einem Tupel

Verfasst: Sonntag 13. April 2014, 14:08
von BlackJack
@duodiscus: Mit einer ``for``-Schleife kannst Du doch etwas für jedes einzelne Element in der Liste machen. Also *in* der Schleife hast Du jeweils nur *ein* Tupel bei jedem Schleifendurchlauf. Und da Du weisst wie man bei *einem* Tupel an das zweite Element kommt, kannst Du auch nacheinander an das zweite Element von allen Tupeln kommen.

@all: Ich würde dafür ja nicht extra etwas importieren:

Code: Alles auswählen

In [2]: sum(m for _, m in firmen)
Out[2]: 155

Re: Addition von Parametern in einem Tupel

Verfasst: Sonntag 13. April 2014, 14:14
von Hyperion
derdon hat geschrieben:Hyperion: Ich hab mich da von Haskell inspirieren lassen:
Hui... die haben tatsächlich ein Built-in für so etwas? Krasse Sache!

Wobei folgendes dann Scala inspiriert wäre:

Code: Alles auswählen

_2 = itemgetter(1)
Die offensichtliche Lösung für den Anfänger sieht dann doch eher so aus:

Code: Alles auswählen

summe = 0
for item in liste:
    summe += item[1]     

summe
> 155

Re: Addition von Parametern in einem Tupel

Verfasst: Sonntag 13. April 2014, 14:35
von duodiscus
Ich bin blutiger Anfänger in Python. Und wir haben bisher nur wesentliche Grundbegriffe und Befehle durchgeführt. Die Aufgabe soll aufjedenfall mithilfe einer for Schleife gelöst werden.
Ich weiß jetzt wie ich auf die einzelnen Listenelemente zugreife:

Code: Alles auswählen

>>> liste[0][1]
25
>>> liste[1][1]
40
Aber wie baue ich eine for Schleife um diese Elemente dann zu durchlaufen und aufzuaddieren?
Eure anderen Vorschläge sind vllt. deutlich einfacher oder sinniger es so zu machen, aber wenn man nur ein bisschen kennt von der Materie muss man es mit solch einfachen Dingen machen :oops:

Mit der for Schleife naja:

Code: Alles auswählen

liste = [ ('Firma A', 25) , ('Firma B', 60) , ('Firma C', 70) ]
for e in liste:
   print(liste[1][1]+liste[0][1])
Weiß nicht genau weiter...

Re: Addition von Parametern in einem Tupel

Verfasst: Sonntag 13. April 2014, 15:20
von cofi
Wirf einen Blick auf Hyperions "Anfaenger-kompatibles" Beispiel.

In deinem Code machst du 2 Sachen falsch:
1. Du greifst nicht auf Listenelement zu (hier `e`, `item` bei Hyperion) sondern auf die Liste
2. Du summierst nicht auf, hierzu brauchst du noch eine Hilfsvariable (`summe` bei Hyperion)

Re: Addition von Parametern in einem Tupel

Verfasst: Sonntag 13. April 2014, 15:36
von duodiscus
Danke für die Fehleranalyse. Habe es soweit korrigiert:

Code: Alles auswählen

liste = [ ('Firma A', 25) , ('Firma B', 60) , ('Firma C', 70) ]
summe = 0
for elemente in liste:
   summe = elemente[1] + summe
   print(summe)
In der Ausgabe wird jetzt allerdings noch jeder Additionsschritt angezeigt:

Code: Alles auswählen

>>> 
25
85
155
>>> 
Wie muss ich das ändern, das nur die Endsumme ausgegeben wird?

Re: Addition von Parametern in einem Tupel

Verfasst: Sonntag 13. April 2014, 15:42
von EyDu
Wie wäre es, wenn du einfach nicht bei jedem Schritt die Summe ausgibst, sondern erst am Ende ;-)

Re: Addition von Parametern in einem Tupel

Verfasst: Sonntag 13. April 2014, 15:45
von mutetella
@duodiscus
Alles, was sich innerhalb einer ``for`` Schleife befindet, wird auch bei jedem Schleifendurchlauf ausgeführt. Und alles, was unter der Schleifendefinition (``for item in list:``) eingerückt ist, befindet sich innerhalb der Schleife.

mutetella

EDIT: Eine IMHO gute Erklärung: Pythons for loop iterations

Re: Addition von Parametern in einem Tupel

Verfasst: Sonntag 13. April 2014, 16:01
von duodiscus
Danke :wink: Das Video hat sehr geholfen!