Addition von Parametern in einem Tupel

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
duodiscus
User
Beiträge: 97
Registriert: Sonntag 6. April 2014, 16:10

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?
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.
duodiscus
User
Beiträge: 97
Registriert: Sonntag 6. April 2014, 16:10

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)
fail
User
Beiträge: 122
Registriert: Freitag 11. Januar 2013, 09:47

Code: Alles auswählen

>>> liste =[('Firma B', 25), ('Firma C', 40)]
>>> liste[1]
('Firma C', 40)
>>> liste[1][1]
40
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

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.
Zuletzt geändert von derdon am Sonntag 13. April 2014, 14:05, insgesamt 1-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Code: Alles auswählen

In [4]: snd = itemgetter(1)
``snd`` für ``second``... fauler Sack :mrgreen:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

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

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 ;)
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
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
duodiscus
User
Beiträge: 97
Registriert: Sonntag 6. April 2014, 16:10

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

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)
duodiscus
User
Beiträge: 97
Registriert: Sonntag 6. April 2014, 16:10

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?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Wie wäre es, wenn du einfach nicht bei jedem Schritt die Summe ausgibst, sondern erst am Ende ;-)
Das Leben ist wie ein Tennisball.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@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
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
duodiscus
User
Beiträge: 97
Registriert: Sonntag 6. April 2014, 16:10

Danke :wink: Das Video hat sehr geholfen!
Antworten