Seite 1 von 1

Iterator nach Wert aufspalten

Verfasst: Montag 27. Januar 2020, 22:13
von Mick
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:

Re: Iterator nach Wert aufspalten

Verfasst: Montag 27. Januar 2020, 22:18
von __blackjack__
@Mick: `itertools.groupby()` ist das Werkzeug dafür. `operator.itemgetter()` ist dabei auch nützlich.

Re: Iterator nach Wert aufspalten

Verfasst: Montag 27. Januar 2020, 23:34
von Mick
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!