Liste in kleinere Listen aufspalten

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
Pseudo
User
Beiträge: 2
Registriert: Sonntag 29. Juni 2014, 19:17

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

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.
Das Leben ist wie ein Tennisball.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@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]?
In specifications, Murphy's Law supersedes Ohm's.
Pseudo
User
Beiträge: 2
Registriert: Sonntag 29. Juni 2014, 19:17

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

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.
Das Leben ist wie ein Tennisball.
Antworten