48 lines
1.2 KiB
Python
48 lines
1.2 KiB
Python
|
#!/usr/bin/env python
|
||
|
# pylint: disable=W0212
|
||
|
|
||
|
from agate import utils
|
||
|
|
||
|
|
||
|
def distinct(self, key=None):
|
||
|
"""
|
||
|
Create a new table with only unique rows.
|
||
|
|
||
|
:param key:
|
||
|
Either the name of a single column to use to identify unique rows, a
|
||
|
sequence of such column names, a :class:`function` that takes a
|
||
|
row and returns a value to identify unique rows, or `None`, in
|
||
|
which case the entire row will be checked for uniqueness.
|
||
|
:returns:
|
||
|
A new :class:`.Table`.
|
||
|
"""
|
||
|
key_is_row_function = hasattr(key, '__call__')
|
||
|
key_is_sequence = utils.issequence(key)
|
||
|
|
||
|
uniques = []
|
||
|
rows = []
|
||
|
|
||
|
if self._row_names is not None:
|
||
|
row_names = []
|
||
|
else:
|
||
|
row_names = None
|
||
|
|
||
|
for i, row in enumerate(self._rows):
|
||
|
if key_is_row_function:
|
||
|
k = key(row)
|
||
|
elif key_is_sequence:
|
||
|
k = (row[j] for j in key)
|
||
|
elif key is None:
|
||
|
k = tuple(row)
|
||
|
else:
|
||
|
k = row[key]
|
||
|
|
||
|
if k not in uniques:
|
||
|
uniques.append(k)
|
||
|
rows.append(row)
|
||
|
|
||
|
if self._row_names is not None:
|
||
|
row_names.append(self._row_names[i])
|
||
|
|
||
|
return self._fork(rows, row_names=row_names)
|