import collections data = [ [1, 2, 3, 4, 5], [1, 9, 3, 4, 5], [1, 10, 8, 4, 5], [1, 12, 13, 7, 5], [1, 14, 13, 13, 6], ] def sorted_by_count(lists): counts = collections.defaultdict(int) for L in lists: for n in L: counts[n] += 1 return [num for num, count in sorted(counts.items(), key=lambda k_v: (k_v[1], k_v[0]), reverse=True)] print sorted_by_count(data)
Now let me generalize it (to fulfill any iterative, cancel the hash requirement), allow key and inverse parameters (to match sorted ones) and rename to freq_sorted :
def freq_sorted(iterable, key=None, reverse=False, include_freq=False): """Return a list of items from iterable sorted by frequency. If include_freq, (item, freq) is returned instead of item. key(item) must be hashable, but items need not be. *Higher* frequencies are returned first. Within the same frequency group, items are ordered according to key(item). """ if key is None: key = lambda x: x key_counts = collections.defaultdict(int) items = {} for n in iterable: k = key(n) key_counts[k] += 1 items.setdefault(k, n) if include_freq: def get_item(k, c): return items[k], c else: def get_item(k, c): return items[k] return [get_item(k, c) for k, c in sorted(key_counts.items(), key=lambda kc: (-kc[1], kc[0]), reverse=reverse)]
Example:
>>> import itertools >>> print freq_sorted(itertools.chain.from_iterable(data)) [1, 5, 4, 13, 3, 2, 6, 7, 8, 9, 10, 12, 14] >>> print freq_sorted(itertools.chain.from_iterable(data), include_freq=True)