no recibe más sencillo que esto, pienso:
a=[("13.5",100)]
b=[("14.5",100), ("15.5", 100)]
c=[("15.5",100), ("16.5", 100)]
input=[a,b,c]
from collections import Counter
print sum(
(Counter(dict(x)) for x in input),
Counter())
Tenga en cuenta que Counter
(también conocido como un conjunto múltiple) es la estructura de datos más natural para sus datos (un tipo de conjunto de los elementos que pueden pertenecer más de una vez, o equivalentemente, un mapa con semántica Elemento -> OccurrenceCount. Podrías haberlo usado en primer lugar, en lugar de listas de tuplas.
También es posible:
from collections import Counter
from operator import add
print reduce(add, (Counter(dict(x)) for x in input))
usando reduce(add, seq)
en lugar de sum(seq, initialValue)
es generalmente más flexible y permite que se salte pasando el valor inicial redundante.
Tenga en cuenta que también puede usar operator.and_
para encontrar la intersección de los multisectos en lugar de la suma.
La variante anterior es terriblemente lenta, porque se crea un nuevo contador en cada paso. Arreglemos eso.
Sabemos que Counter+Counter
devuelve un nuevo Counter
con datos combinados.Esto está bien, pero queremos evitar la creación adicional. Vamos a usar en lugar Counter.update
:
actualización (uno mismo, iterables = ninguno, ** kwds) Método collections.Counter no unido
Como dict.update() además de añadir los recuentos en lugar de sustituirlos. La fuente puede ser un iterable, un diccionario u otra instancia de contador.
Eso es lo que queremos. Vamos a envolverlo con una función compatible con reduce
y ver qué pasa.
def updateInPlace(a,b):
a.update(b)
return a
print reduce(updateInPlace, (Counter(dict(x)) for x in input))
Esto es solo un poco más lento que la solución del OP.
Benchmark: http://ideone.com/7IzSx(Actualizado con otra solución, gracias a astynax)
(también: Si desea desesperadamente una sola línea, puede reemplazar updateInPlace
por lambda x,y: x.update(y) or x
que trabaja el De la misma manera, e incluso resulta ser una fracción de segundo más rápido, pero no puede leerse. No :-))
uso 'Contador()' –
@AshwiniChaudhary: 'Contador()' solamente cuenta las ocurrencias, y como los valores ya están precompuestos, no funcionará para este escenario. –
@ChristianWitts vea mi solución a continuación. –