Buat iterator yang mengembalikan kunci dan grup berturut-turut dari iterable. Kuncinya adalah fungsi yang menghitung nilai kunci untuk setiap elemen. Jika tidak ditentukan atau Tidak Ada, kunci default ke fungsi identitas dan mengembalikan elemen tanpa perubahan. Secara umum, iterable harus sudah diurutkan berdasarkan fungsi kunci yang sama.
itertools.groupby(iterable, key=None)
groups = []
uniquekeys = []
data = sorted(data, key=keyfunc)
for k, g in groupby(data, keyfunc):
groups.append(list(g)) Store group iterator as a list
uniquekeys.append(k)
class groupby:
[k for k, g in groupby('AAAABBBCCDAABBB')] --> A B C D A B
[list(g) for k, g in groupby('AAAABBBCCD')] --> AAAA BBB CC D
def __init__(self, iterable, key=None):
if key is None:
key = lambda x: x
self.keyfunc = key
self.it = iter(iterable)
self.tgtkey = self.currkey = self.currvalue = object()
def __iter__(self):
return self
def __next__(self):
self.id = object()
while self.currkey == self.tgtkey:
self.currvalue = next(self.it) Exit on StopIteration
self.currkey = self.keyfunc(self.currvalue)
self.tgtkey = self.currkey
return (self.currkey, self._grouper(self.tgtkey, self.id))
def _grouper(self, tgtkey, id):
while self.id is id and self.currkey == tgtkey:
yield self.currvalue
try:
self.currvalue = next(self.it)
except StopIteration:
return
self.currkey = self.keyfunc(self.currvalue)