У меня очень большой список словарей, и я хочу подвести итог - PullRequest
0 голосов
/ 07 июля 2011

Что-то вроде

{A: 3, 45, 34, 4, 2, 5, 94, 2139, 230345, 283047, 230847}, {B: 92374, 324, 345, 345, 45879, 34857987, 3457938457), {C: 23874923874987, 2347}

Как я могу уменьшить это до

{A: 2304923094820398}, {B: 2374923784897}, {C: 29348239847239847}

Значения явно не точные.Я просто хочу сложить все значения, не занимая много времени.

Ответы [ 6 ]

2 голосов
/ 07 июля 2011
d = [{'A': [3, 45, 34, 4, 2, 5, 94, 2139, 230345, 283047, 230847]}, {'B': [92374, 324, 345, 345, 45879, 34857987, 3457938457]}, {'C': [23874923874987, 2347]}]
[{x.keys()[0]:sum(x.values()[0])} for x in d]
1 голос
/ 07 июля 2011

Примерно так:

a={'a':range(100), 'b':range(200)}
b={}

for k,v in a.iteritems():
    b[k]=sum(v)

print b

дает

{'a': 4950, 'b': 19900}
0 голосов
/ 07 июля 2011
d = [{'A': [3, 45, 34, 4, 2, 5, 94, 2139, 230345, 283047, 230847]}, {'B': [92374, 324, 345, 345, 45879, 34857987, 3457938457]}, {'C': [23874923874987, 2347]}]
abc = {}
for x in d:
    for k, v in x.iteritems():
        abc[k] = reduce(lambda x,y: x+y, v)
0 голосов
/ 07 июля 2011

Если у вас действительно большое количество значений, я, вероятно, буду использовать numpy и добавлю вектор.

Итак, что-то вроде

 a = numpy.arange(10, 2000000)
 total = numpy.sum(a)

Не больше, не меньше :)

0 голосов
/ 07 июля 2011

Если у вас много, много и много значений, что-то вроде этого может сработать (при условии, что под «списком словарей» вы подразумеваете «словарь списков», так как наличие большого списка словарей с одним ключом / значением пары будет быть глупым, и, таким образом, значения хранятся в dict как {'A': [3, 45, 34, 4, 2, 5, 94, 2139, 230345, 283047, 230847], 'B': [92374, 324, 345, 345, 45879, 34857987, 3457938457], ...}):

from multiprocessing import Process, Lock

def sumfunc(lock, key, values):
    total = sum(values)

    lock.acquire()
    print(key + ':', total)   # The actual code would be better off utilizing shared multiprocessing.Array objects, but I haven't used them before so am not sure quite how you set them up so decided to leave that aside for now as this is just a theoretical example.
    lock.release()

if __name__ == '__main__':
    lock = Lock()

    for key, values in dict_of_values_to_sum.items():
        Process(target=sumfunc, args=(lock, key, values)).start()
0 голосов
/ 07 июля 2011

Предполагая, что значения находятся в списке, например:

d = {A: [3, 45, 34, 4, 2, 5, 94, 2139, 230345, 283047, 230847]}, {B: [92374, 324, 345, 345, 45879, 34857987, 3457938457]), {C: [23874923874987, 2347]}

затем:

new_d = []
for i in d:
    new_d.append(dict([(k,sum(v)) for k,v in i.itervalues()]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...