Listen umwandeln

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
pythonnoob12345
User
Beiträge: 2
Registriert: Samstag 19. November 2022, 21:46

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)
Benutzeravatar
Kebap
User
Beiträge: 696
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

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']
>>>
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Benutzeravatar
bi3mw
User
Beiträge: 11
Registriert: Mittwoch 19. Oktober 2022, 23:14

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)
Benutzeravatar
Kebap
User
Beiträge: 696
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

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')]
>>>
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Sirius3
User
Beiträge: 17820
Registriert: Sonntag 21. Oktober 2012, 17:20

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)
pythonnoob12345
User
Beiträge: 2
Registriert: Samstag 19. November 2022, 21:46

Danke für die Antwort!
bb1898
User
Beiträge: 200
Registriert: Mittwoch 12. Juli 2006, 14:28

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)
Benutzeravatar
Kebap
User
Beiträge: 696
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

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.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Antworten