Найти - Пользователи
Полная версия: сложение значений в словаре
Начало » Python для новичков » сложение значений в словаре
1
P_N
Доброе время. Есть файл 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])
не подскажете, как она должна выглядеть?
Rodegast
Надо как-то так:
if a[1] in D.keys():
        D[a[1]] += int(a[0])
else:
        D[a[1]] = int(a[0])
terabayt
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)
P_N
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)
а так - работает. Спасибо!
Rodegast
> так не работает

У меня всё работает.
>>> 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}
А вообще это очень заезженная тема, тут полно решений подобных задач.
Shaman
Лежало в закромах без дела
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]))
marvellik
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}
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB