Alternative version: def cluster(data): d = defaultdict(list) pairs = enumerate(data) if isinstance(data, list) else data.iteritems() for k, v in pairs: d[v].append(k) return d Bye, bearophile