Addition aller Werte von zwei Listen

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
mrlow
User
Beiträge: 4
Registriert: Montag 12. September 2016, 15:00

Moin Leute,

ich bin neu hier und habe mich schon etwas länger in Python3 eingearbeitet. Die Grundfunktionen bekomme ich super hin, allerdings hängt es gerade an einer Aufgabe:

Ich habe zwei Listen:
L1 = [1, 2, 3, 4, 5]
L2 = [6, 7, 8, 9]

Nun möchte ich sämtliche werte der ersten Liste(L1) mit sämtlichen Werten der zweiten Liste(L2) addieren/multiplizieren. Das Ergebnis sollte so dargestellt werden:

1 + 6 = 7
1 + 7 = 8
1 + 8 = 9
1 + 9 = 10

2 + 6 = 8
2 + 7 = 9
...usw

Habt ihr eine gute Idee für eine verständliche (und schnelle) Umsetzung? Ich bin für jede Hilfe sehr dankbar! =)
BlackJack

@mrlow: Du musst etwas für jedes Element der ersten Liste machen. Nämlich einen Block von Zeilen ausgeben bei dem der erste Summand das jeweilige Element ist. Jeder Block besteht aus einer Zeile für jedes Element aus der zweiten Liste. Für so etwas gibt es Schleifen.
mrlow
User
Beiträge: 4
Registriert: Montag 12. September 2016, 15:00

Danke, das habe ich soweit verstanden.
Das Ergebnis sieht so aus:

Code: Alles auswählen

for i in L1:
    for j in L2:
        print(i,"+", j,"=",i+j)
    print(" ")
Nun möchte ich diese Berechnung mit den jeweiligen Intervallen ausführen. Das Ergebnis soll so aussehen:

1 bis 2 + 6 bis 7
1 bis 2 + 7 bis 8
1 bis 2 + 8 bis 9

2 bis 3 + 6 bis 7
2 bis 3 + 7 bis 8

Mein Problem dabei ist, dass ich nicht weiß, wie der Index i ab dem zweiten Element ausgegeben wird (also in dem Fall 2). Hast du einen Tipp für mich?
BlackJack

@mrlow: Bei den ”Rezepten” in der Dokumentation zum `itertools`-Modul ist eine Funktion `pairwise()` die Du dafür brauchst.
mrlow
User
Beiträge: 4
Registriert: Montag 12. September 2016, 15:00

Vielen Dank für den Tipp!
Es funktioniert, wie ich das möchte.
Der Code sieht so aus:

Code: Alles auswählen

def pairwise(iterable):
    iterable = iter(iterable)
    a, b = next(iterable), next(iterable)
    while 1:
        yield a, b
        try:
            a, b = b, next(iterable)
        except TypeError:
            yield b
            break
            
k = list(pairwise(L1))
l = list(pairwise(L2))

for x in k:
    for y in l:
        print('{0:5d} {1:5d} {2:5d} {3:5d}'.format(x[0], x[1], y[0], y[1]))
    print("")
Zuletzt geändert von Anonymous am Dienstag 13. September 2016, 11:06, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@mrlow: `pairwise()` ist in der Dokumentation wesentlich einfacher definiert.

Aus dem Iterator eine Liste zu machen widerspricht irgendwie der Idee un den Vorteilen die Iteratoren hier bieten. Nämlich das eben keine Liste erstellt wird, mit Werten, die man gar nicht auf einmal benötigt.

Code: Alles auswählen

from itertools import izip, tee


def pairwise(iterable):
    a, b = tee(iterable)
    next(b, None)
    return izip(a, b)


def main():
    values_a = [1, 2, 3, 4, 5]
    values_b = [6, 7, 8, 9]

    for a_1, a_2 in pairwise(values_a):
        for b_1, b_2 in pairwise(values_b):
            print('{0:5d} {1:5d} {2:5d} {3:5d}'.format(a_1, a_2, b_1, b_2))
        print()


if __name__ == '__main__':
    main()
mrlow
User
Beiträge: 4
Registriert: Montag 12. September 2016, 15:00

...so habe ich wieder was gelernt ;-)
Lösung funktioniert wie vorher, aber ich spare mir Bearbeitungsschritte und der Code wird lesbarer. Das ist doch etwas ;-)

Folgende Info zur tee()
Once tee() has made a split, the original iterable should not be used anywhere else; otherwise, the iterable could get advanced without the tee objects being informed.

This itertool may require significant auxiliary storage (depending on how much temporary data needs to be stored). In general, if one iterator uses most or all of the data before another iterator starts, it is faster to use list() instead of tee().
Da ich vorhabe, das Programm in Zukunft um weitere Listen (und Schleifen) zu ergänzen, könnte die Benutzung von tee() ggf. zum 'Problem' werden. Hast du vielleicht schon Erfahrungen damit gesammelt?
BlackJack

@mrlow: So ziemlich alles kann zu Problemen führen wenn man es ungünstig oder falsch verwendet. Hinweise stehen da ja in der Dokumentation. Im Vorliegenden Fall wird innerhalb von `pairwise()` der ursprüngliche Iterator nicht mehr verwendet und ausserhalb auch nicht. Und die beiden neuen Iteratoren haben immer nur ein Element ”Abstand”.
Antworten