Seite 1 von 1

Listen umwandeln

Verfasst: Samstag 19. November 2022, 22:03
von pythonnoob12345
Ich habe versucht, ein Programm zu schreiben, welches aus einer Liste wie folgender
liste = ['a','b','c','d']
in eine solche umwandelt:
neue_liste = ['a:b','a:c','a:d','b:c','b:d','c:d']
Also dass jedes Element einmal mit jedem anderen gepaart wird.

Ich habe es mit folgendem versucht, bin allerdings gescheitert.

Code: Alles auswählen

liste = ['a','b','c','d']
neue_liste = []
n = 0
m = 0
while n <= len(liste)-1:
	m=n+1
	while m <= len(liste):
		element = str(liste[n]) + ':' + str(liste[m])
		neue_liste.append(element)
		m=+1
	n=+1
print(neue_liste)

Re: Listen umwandeln

Verfasst: Sonntag 20. November 2022, 00:05
von Kebap
Warum willst du das machen? Was hast du dann mit den Paaren vor?

Code: Alles auswählen

>>> liste = ["a", "b", "c"]
>>> neue_liste = [f"{x}:{y}" for x in liste for y in liste]
>>> neue_liste
['a:a', 'a:b', 'a:c', 'b:a', 'b:b', 'b:c', 'c:a', 'c:b', 'c:c']
>>>

Re: Listen umwandeln

Verfasst: Sonntag 20. November 2022, 00:06
von bi3mw
Hi,
folgender Code gibt aus was Du möchtest:

Code: Alles auswählen

#!/usr/bin/env python
# -*-coding: utf-8-*-

liste = ['a', 'b', 'c', 'd']

def tessa(source):
    result = []
    for p1 in range(len(source)):
        for p2 in range(p1+1, len(source)):
            result.append([source[p1], source[p2]])
    return result

pairings = tessa(liste)
print("%d pairings" % len(pairings))
for pair in pairings:
    print(pair)

Re: Listen umwandeln

Verfasst: Sonntag 20. November 2022, 00:21
von Kebap
Eigentlich will man die einzelnen Paare nicht in einem String haben, sondern wieder in einer (Unter-)Liste oder einem Tuple, z.B. so:

Code: Alles auswählen

>>> from itertools import combinations
>>> list(combinations("abcd", r=2))
[('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'c'), ('b', 'd'), ('c', 'd')]
>>>

Re: Listen umwandeln

Verfasst: Sonntag 20. November 2022, 11:31
von Sirius3
Eingerückt wird immer mit 4 Leerzeichen pro Ebene, keine Tabs. Die äußere Schleife geht bis Länge-1, die innere dagegen näbis zur Länge der Liste, und damit als Index über das Ende der Liste hinaus. Besser mit < vergleichen.
Die Elemente der Liste sind bereits Strings, die nochmals per str umzuwandeln also überflüssig.
Den Schleifenindex muss nun hochzählen, statt ihn nur auf 1 zu setzen, denn so wird die Schleife niemals beendet.
Das m = 0 wird nirgends benutzt.

Code: Alles auswählen

liste = ['a','b','c','d']
neue_liste = []
n = 0
while n < len(liste):
    m = n+1
    while m < len(liste):
        element = f"{liste[n]}:{liste[m]}"
        neue_liste.append(element)
        m += 1
    n += 1
print(neue_liste)
Statt der while-Schleifen sind for-Schleifen hier aber viel klarer.

Code: Alles auswählen

for n in range(len(liste)):
    for m in range(n + 1, len(liste)):
        element = f"{liste[n]}:{liste[m]}"
        neue_liste.append(element)
print(neue_liste)

Re: Listen umwandeln

Verfasst: Sonntag 20. November 2022, 14:42
von pythonnoob12345
Danke für die Antwort!

Re: Listen umwandeln

Verfasst: Sonntag 20. November 2022, 15:45
von bb1898
Ich wundere mich, dass diesmal niemand darauf hinweist, dass man über Listen direkt iterieren kann. Ganz ohne Index geht es hier zwar nicht, aber zum Beispiel so:

Code: Alles auswählen

liste = "abcd"     # Zum Einlesen genau so gut wie Liste.
neue_liste = []    # Das Ergebnis soll aber eine Liste sein, keine Zeichenkette.

for (n, x) in enumerate(liste):
     for y in liste[n + 1:]:
          element = f"{x}:{y}"
          neue_liste.append(element)
print(neue_liste)

Re: Listen umwandeln

Verfasst: Montag 21. November 2022, 00:05
von Kebap
bb1898 hat geschrieben: Sonntag 20. November 2022, 15:45 Ganz ohne Index geht es hier zwar nicht
Eigentlich hatte ich Möglichkeiten gezeigt.. :mrgreen:

Code: Alles auswählen

>>> from itertools import combinations
>>> [f"{x}:{y}" for x, y in combinations("abcd", r=2)]
['a:b', 'a:c', 'a:d', 'b:c', 'b:d', 'c:d']
>>>
Hätte aber gerne Antworten auf meine Rückfragen gehabt, weil das hier stark nach einem x/y-Problem riecht.