def test_itervalues(): table = (('foo', 'bar', 'baz'), ('a', 1, True), ('b', 2), ('b', 7, False)) actual = itervalues(table, 'foo') expect = ('a', 'b', 'b') ieq(expect, actual) actual = itervalues(table, 'bar') expect = (1, 2, 7) ieq(expect, actual) actual = itervalues(table, ('foo', 'bar')) expect = (('a', 1), ('b', 2), ('b', 7)) ieq(expect, actual) actual = itervalues(table, 'baz') expect = (True, None, False) ieq(expect, actual) actual = itervalues(table, ('foo', 'baz')) expect = (('a', True), ('b', None), ('b', False)) ieq(expect, actual)
def isunique(table, field): """ Return True if there are no duplicate values for the given field(s), otherwise False. E.g.:: >>> import petl as etl >>> table1 = [['foo', 'bar'], ... ['a', 1], ... ['b'], ... ['b', 2], ... ['c', 3, True]] >>> etl.isunique(table1, 'foo') False >>> etl.isunique(table1, 'bar') True The `field` argument can be a single field name or index (starting from zero) or a tuple of field names and/or indexes. """ vals = set() for v in itervalues(table, field): if v in vals: return False else: vals.add(v) return True
def iterpivot(source, f1, f2, f3, aggfun, missing): # first pass - collect fields f2vals = set(itervalues(source, f2)) # TODO only make one pass f2vals = list(f2vals) f2vals.sort() outhdr = [f1] outhdr.extend(f2vals) yield tuple(outhdr) # second pass - generate output it = iter(source) hdr = next(it) flds = list(map(text_type, hdr)) f1i = flds.index(f1) f2i = flds.index(f2) f3i = flds.index(f3) for v1, v1rows in itertools.groupby(it, key=operator.itemgetter(f1i)): outrow = [v1] + [missing] * len(f2vals) for v2, v12rows in itertools.groupby(v1rows, key=operator.itemgetter(f2i)): aggval = aggfun([row[f3i] for row in v12rows]) outrow[1 + f2vals.index(v2)] = aggval yield tuple(outrow)