Seite 1 von 1

Liste in kleinere Listen aufspalten

Verfasst: Sonntag 29. Juni 2014, 19:26
von Pseudo
Hi,

ich habe ein kleines Problem und zwar muss ich für eine Programm eine Funktion schreiben, die eine beliebige Liste in kleiner aufteilt (es is in Worten etwas schwierig zu erklären, also zeige ich mal ein Beispiel):
[1,2,3,4,5,6,7,8,9] soll in alle möglichen 2er Gruppen aufgeteilt werden:

[[1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [1, 8], [1, 9], [2, 2], [2, 3],
[2, 4], [2, 5], [2, 6], [2, 7], [2, 8], [2, 9], [3, 3], [3, 4], [3, 5], [3, 6],
[3, 7], [3, 8], [3, 9], [4, 4], [4, 5], [4, 6], [4, 7], [4, 8], [4, 9], [5, 5],
[5, 6], [5, 7], [5, 8], [5, 9], [6, 6], [6, 7], [6, 8], [6, 9], [7, 7], [7, 8],
[7, 9], [8, 8], [8, 9]]

Dazu habe ich eine Funktion geschrieben:

Code: Alles auswählen

def chunk(list, n):
	r = []
	l = [a for a in range(0, n)]
	while(l[0] != (len(list))-1):
		e = []
		for i in l:
			print i
			e.append(list[i])
		r.append(e)
		c = 0
		b = True
		while(b):
			c += 1
			b = (l[-c] == (len(list)-1))
			
		l[-c] += 1
		for k in range(1, c):
			l[-k] = l[-c]
	return r
Diese Funktion funktioniert auch gut, aber nur, wenn als zweites argument 2 übergeben wird. Bei 3 kommt zum Beispiel die Menge [1,3,3] im Ergebnis vor, obwohl sie es nicht sollte. Gibt es irgendeinen leichteren Weg, und wenn nicht, was stimmt mit meiner Funktion nicht?

Vielen Dank

Re: Liste in kleinere Listen aufspalten

Verfasst: Sonntag 29. Juni 2014, 19:37
von EyDu
Hallo und willkommen im Forum!

Deine Funktion ist viel zu kompliziert. Ich verstehe dein Vorgehen nicht im Ansatz. Das liegt vielleicht auch an den schlecht gewählten Bezeichnern, welche aller nur ein Buchstabe lang sind. Daran solltest du unbedingt arbeiten, das trägt massiv zum Codeverständnis bei. Prinzipiell kann man dein Problem recht einfach iterativ lösen, du solltest da aber mit einer Rekursion rangehen. Dein Problem ist eines der Einstiegsprobleme, da solltest du viel Information zu finden.

Wenn es dir nur um die Funktionalität geht, dann schau dir im itertools-Modul die combinations-Funktion an, die hat (fast) genau das von dir gewünschte Verahlten.

Vielleicht noch einige Anmerkungen zum Code: Wie oben schon gesagt, solltest du dir dringend bessere Bezeichner angewöhnen, bei den Namen weißt du in ein paar Tagen schon nicht mehr, was sie eigentlich bedeuten. "list" solltest du als Namen gar nicht verwenden, das verdeckt den eingebauten Listendatentyp von Python. Generell solltest du keine Typinformation in Namen stecken haben.

"i" als Laufvariable hat in der Informatik (und der Mathematik) eine besondere Bedeutung. *Jeder* erwartet bei einem "i", dass dort nur ganzzahlige Werte drin stecken. Alles andere ist eine Überraschung. Die Einrückung bei Python beträgt übrigens vier Leerzeichen pro Ebene, bei dir sind es etwas viele. Tabs solltest du vermeiden. In PEP 8 steht etwas mehr dazu drin.

Mein Tipp: Bevor du das itertools-Modul verwendest, solltest du die Aufgabe erstmal selbstständig rekursiv Lösen. Das ist Handwerkszeug, welches du an jeder Ecke benötigst.

Re: Liste in kleinere Listen aufspalten

Verfasst: Sonntag 29. Juni 2014, 19:39
von pillmuncher
@Pseudo: Wenn [2, 2], [3, 3], [4, 4], [5, 5], [6, 6], [7, 7] und [8, 8] im Ergebnis vorkommen sollen, warum dann nicht auch [1, 1] und [9, 9]?

Re: Liste in kleinere Listen aufspalten

Verfasst: Sonntag 29. Juni 2014, 20:19
von Pseudo
Tatsache, das hatte ich glatt übersehen, es sollen garkeine Listen vorkommen, die ein Element doppelt beinhalten. Aber ich glaube kaum, dass das rekursiv einfacher zu lösen ist, ich schau mir sobald ich zeit hab mal itertools an.

Re: Liste in kleinere Listen aufspalten

Verfasst: Sonntag 29. Juni 2014, 21:30
von EyDu
Pseudo hat geschrieben:Aber ich glaube kaum, dass das rekursiv einfacher zu lösen ist, ich schau mir sobald ich zeit hab mal itertools an.
Das ist so einfach rekursiv zu lösen, dass es ein Standardbeispiel für rekursive Probleme ist. Ohne Nachdenken ist da eine Lösung in fünf oder sechs kurzen Zeilen möglich.