Iterator nach Wert 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
Mick
User
Beiträge: 9
Registriert: Mittwoch 8. Januar 2020, 09:12

Hallo,

ich habe einen Iterator, der Listen mit zwei Elementen ausgibt, die nach dem ersten Element geordnet sind.

Wie kann ich diesen Iterator am besten in kleine Iterators aufspalten, die immer genau die Elemente ausgeben, die die gleiche Zahl vorne haben?

Code: Alles auswählen

myiterator = iter(
[[1,4124],
[1,12315],
[2,154123],
[4,5123],
[4,9582],
[4,12],
[7,923]])


def my_outer_iterator(my_inner_iterator):

	more_input = True
	next_item = next(my_inner_iterator)

	while more_input:

		my_list = []
		current_number = next_item[0]

		while current_number == next_item[0]:

			my_list.append(next_item)

			try:
				next_item = next(my_inner_iterator)
			except:
				more_input = False
				break

		yield my_list

for foo in my_outer_iterator(myiterator):
	print(foo)
	
Dieser Code tut schonmal, was er soll, aber das kann man bestimmt noch eleganter lösen oder? :lol:
Benutzeravatar
__blackjack__
User
Beiträge: 14051
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Mick: `itertools.groupby()` ist das Werkzeug dafür. `operator.itemgetter()` ist dabei auch nützlich.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Mick
User
Beiträge: 9
Registriert: Mittwoch 8. Januar 2020, 09:12

Ach war klar, dass itertools auch dafür was hat :D

Also so ja:

Code: Alles auswählen

import itertools
import operator

myiterator = iter(
[[1,4124],
[1,12315],
[2,154123],
[4,5123],
[4,9582],
[4,12],
[7,923]])


test_iterator = itertools.groupby(myiterator,key=operator.itemgetter(0))

for group, foo in test_iterator:
	print(group, list(foo))
Funktioniert auf jeden Fall, Danke!
Antworten