Ranking Elements of multiple Lists by their count in Python
Question: I want to rank multiple lists according to their elements how often they
appear in each list. Example:

list1 = 1,2,3,4  
list2 = 4,5,6,7  
list3 = 4,1,8,9  

result = 4,1,2,3,4,5,6,7,8 (4 is counted three times, 1 two times and the rest
once)

I've tried the following but i need something more intelligent and something i
can do with any ammount of lists.

    
    
     l = []
     l.append([ 1, 2, 3, 4, 5])
     l.append([ 1, 9, 3, 4, 5])
     l.append([ 1, 10, 8, 4, 5])
     l.append([ 1, 12, 13, 7, 5])
     l.append([ 1, 14, 13, 13, 6])
    
     x1 = set(l[0]) & set(l[1]) & set(l[2]) & set(l[3])
     x2 = set(l[0]) & set(l[1]) & set(l[2]) & set(l[4])
     x3 = set(l[0]) & set(l[1]) & set(l[3]) & set(l[4])
     x4 = set(l[0]) & set(l[2]) & set(l[3]) & set(l[4])
     x5 = set(l[1]) & set(l[2]) & set(l[3]) & set(l[4])
     set1 = set(x1) | set(x2) | set(x3) | set(x4) | set(x5)
    
     a1 = list(set(l[0]) & set(l[1]) & set(l[2]) & set(l[3]) & set(l[4]))
     a2 = getDifference(list(set1),a1)
     print a1
     print a2
    

Now here is the problem... i can do it again and again with a3,a4 and a5 but
its too complex then, i need a function for this... But i don't know how... my
math got stuck ;)

SOLVED: thanks alot for the discussion. As a newbee i like this system
somehow: fast+informative. You helped me all out! Ty


Answer: 
    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's generalize it (to take any iterable, loosen hashable requirement),
allow key and reverse parameters (to match sorted), and rename to
[freq_sorted](http://bitbucket.org/kniht/scraps/src/6f5692c4f9d2/python/iter_util.py#cl-9):

    
    
    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)
    # (slightly reformatted)
    [(1, 5),
     (5, 4),
     (4, 3), (13, 3),
     (3, 2),
     (2, 1), (6, 1), (7, 1), (8, 1), (9, 1), (10, 1), (12, 1), (14, 1)]
    

