Уведомления

Группа в Telegram: @pythonsu

#1 Июль 11, 2016 15:24:22

P_N
Зарегистрирован: 2016-02-09
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

сложение значений в словаре

Доброе время. Есть файл summ_stolb.txt вида:
10 - ivan
20 - petr
20 - ivan
30 - petr
хочется на основании этого файла получить словарь, где второй столбец- это ключи, а первый столбец надо сложить, если ключи совпадают. т.е. на выходе надо получить словарь в данном случае такой:
{“ivan”: 30, “petr”:50}
пока удалось написать вот это:

import os, sys
f = open("d:/summ_stolb.txt", "r")
b=f.readlines()
D={}
for i in b:
    a=i.split(" - ")
    if a[1] in D.keys():
        D[a[1]]= 10+int(a[0])
    else:
        D[a[1]]=a[0]
    #D[a[1]]=a[0]
    print(a[1], a[0])
print(list(D.items()))
f.close()
проблема вот в этой строке
D[a[1]]= 10+int(a[0])
не подскажете, как она должна выглядеть?

Офлайн

#2 Июль 11, 2016 15:38:51

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2843
Репутация: +  186  -
Профиль   Отправить e-mail  

сложение значений в словаре

Надо как-то так:

if a[1] in D.keys():
        D[a[1]] += int(a[0])
else:
        D[a[1]] = int(a[0])



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Июль 11, 2016 15:40:20)

Офлайн

#3 Июль 11, 2016 15:39:03

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

сложение значений в словаре

from collections import defaultdict
d = defaultdict(int)
with open("d:/summ_stolb.txt") as f:
    for l in f:
        v, k = l.split(' - ')
        d[k] += int(v)
d = {}
with open("d:/summ_stolb.txt") as f:
    for l in f:
        v, k = l.split(' - ')
        d[k] = d,get(k, 0) + int(v)



————————————————
-*- Simple is better than complex -*-

Офлайн

#4 Июль 11, 2016 15:45:58

P_N
Зарегистрирован: 2016-02-09
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

сложение значений в словаре

Rodegast
Надо как-то так:
ivan
 10
petr
 20
Traceback (most recent call last):
  File "C:/Documents and Settings/userYandexDisk/test/summ_nashe.py", line 9, in <module>
    D[a[1]]+=int(a[0])
TypeError: Can't convert 'int' object to str implicitly
так не работает
terabayt
d = d,get(k, 0) + int(v)
а так - работает. Спасибо!

Отредактировано P_N (Июль 11, 2016 15:46:25)

Офлайн

#5 Июль 11, 2016 16:10:17

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2843
Репутация: +  186  -
Профиль   Отправить e-mail  

сложение значений в словаре

> так не работает

У меня всё работает.

>>> D = {}
>>> def test(k, v):
...     if k in D:
...         D[k] += int(v)
...     else:
...         D[k] = int(v)
>>> D
{}
>>> test("ivan", 10)
>>> test("petr", 20)
>>> test("ivan", 20)
>>> test("petr", 30)
>>> D
{'ivan': 30, 'petr': 50}
А вообще это очень заезженная тема, тут полно решений подобных задач.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#6 Июль 11, 2016 19:07:57

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

сложение значений в словаре

Лежало в закромах без дела

def group_and_sum(data, grp_indexes, val_indexes):
    from collections import OrderedDict
    grouped = OrderedDict()
    for row in data:
        holder = grouped.setdefault(tuple(row[i] for i in grp_indexes),
                                    OrderedDict())
        for val in val_indexes:
            holder[val] = holder.get(val, 0) + row[val]
    return grouped
 
data = [{'val': 10, 'name': 'ivan'},
        {'val': 20, 'name': 'petr'},
        {'val': 20, 'name': 'ivan'},
        {'val': 30, 'name': 'petr'}]
 
print(group_and_sum(data, ['name'], ['val']))
 
data = [(10, 'ivan'),
        (20, 'petr'),
        (20, 'ivan'),
        (30, 'petr')]
 
print(group_and_sum(data, [1], [0]))

Офлайн

#7 Июль 11, 2016 19:46:10

marvellik
Зарегистрирован: 2016-05-15
Сообщения: 639
Репутация: +  73  -
Профиль   Отправить e-mail  

сложение значений в словаре

D = {}
with open('summ_stolb.txt') as file:
     for val,key in (i.strip().split('-') for i in file.readlines()):
        if key in D:
            D[key] += int(val)
        else:
            D[key] = int(val)
print(D)

>>> {' petr': 50, ' ivan': 30}

Отредактировано marvellik (Июль 11, 2016 19:47:48)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version