def list2counts(duplist, hash): countdict = {} for d in duplist: if hash(d) in countdict: countdict[hash(d)]['count'] += 1 else: countdict[hash(d)] = {'count': 1, 'item': d} return countdict def list2countstuple(duplist, hash): return ((v['item'], v['count']) for v in list2counts(duplist, hash).values()) def joinordie(joinstr, diestr): return joinstr % diestr if diestr else '' def flatten(lst): for elem in lst: if type(elem) in (tuple, list): for i in flatten(elem): yield i else: yield elem