Python tuple operaciones y recuento

Tengo la siguiente tupla. Quiero construir una cadena que produzca resultados como se indica en la salida. Quiero contar todos los elementos correspondientes a ‘a’, es decir, cuántos k1 se produjo wrt ‘a’ y así sucesivamente. ¿Cuál es la forma más fácil de hacer esto

a=[('a','k1'),('b','k2'),('a','k2'),('a','k1'),('b','k2'),('a','k1'),('b','k2'),('c','k3'),('c','k4')] 

La salida debe estar en una cadena de salida = “”

  a k1 3 a k2 1 b k1 1 b k2 3 c k3 1 c k4 1 

Puede hacer la porción de adición fácilmente con defaultdict . El dict predeterminado funciona como un diccionario normal, excepto que tiene un valor predeterminado para los almacenes de claves vacíos, de modo que puede incrementar fácilmente su contador cuando itere sobre su conjunto de datos.

 a=[('a','k1'),('b','k2'),('a','k2'),('a','k1'),('b','k2'),('a','k1'),('b','k2'),('c','k3'),('c','k4')] from collections import defaultdict b = defaultdict(int) for item in a: b[item] += 1 print b defaultdict(, {('a', 'k2'): 1, ('c', 'k3'): 1, ('b', 'k2'): 3, ('a', 'k1'): 3, ('c', 'k4'): 1}) 

Y para imprimirlo, simplemente itere sobre los datos resultantes e imprímalo como desee.

 for key, value in b.iteritems(): print '%s %s %s' % (key[0], key[1], value) 

Usa la clase Counter de las collections :

 >>> a = [('a', 'k1'), ('b', 'k2'), ('a', 'k2'), ('a', 'k1'), ('b', 'k2'), ('a', 'k1'), ('b', 'k2'), ('c', 'k3'), ('c', 'k4')] >>> from collections import Counter >>> c = Counter(a) Counter({('b', 'k2'): 3, ('a', 'k1'): 3, ('a', 'k2'): 1, ('c', 'k3'): 1, ('c', 'k4'): 1}) 

Puedes usar c.items() para iterar sobre los conteos:

 >>> for item in c.items(): ... print(item) ... (('a', 'k2'), 1) (('c', 'k3'), 1) (('b', 'k2'), 3) (('a', 'k1'), 3) (('c', 'k4'), 1) 

El código anterior es Python 3. La clase Counter es nueva en Python 2.7. Ahora puede reorganizar los elementos en el orden deseado y convertirlos en una cadena si es necesario.