как суммировать значения в списке для ключа в строковом типе данных, имея дефис в качестве одного из значений

У меня есть словарь по названию temp

 dict_items([('/history/apollo/', ['6245', '6245', '6245', '6245', '6245', '6245', '6245',
'6245']), ('/shuttle/countdown/', ['3985', '3985', '3985', '3985', '3985', '3985', '3985',
'-', '-', '-', '0', '3985', '4247', '3985', '3985', '3998', '0',
'3985', '3985', '3985', '3985', '4247', '3985', '3985', '398, '3985']), ('/', ['7074', '7074', '7074',
'7074', '7074', '7074', '7074', '7074', '7074', '7074', '70]), ('/images/dual-pad.gif', ['141308', '141308',
'0', '141308', '141308', '141308', '0', '141308', '0', '141308', '141308']),
('/images/NASA-logosmall.gif', ['0', '786', '786', '0', '786', '786', '786', 
'786', '786', '786', '786', '786', '786', '786', '786', '0', 
'786', '786', '786'])])

его основной URL-адрес и пропускная способность, связанные с конкретным URL-адресом, мне нужна сумма всех значений в списке, которые находятся в строке для определенного ключа, игнорируя дефис, который является одним из значений для ключа

desired output:

dict_items([('/history/apollo/', ['4996'], ('/', ['70810']), ('/images/dual-
pad.gif', ['113040']), ('/images/NASA-logosmall.gif', ['12576'])]) 

 #Or total value for a key without string 
 #dict_items([(/history/apollo/, [4996], (/, [70810])(/images/dual-
    pad.gif, [113040]), (/images/NASA-logosmall.gif, [12576])]) 

 my code is 
 sums = {k: sum(i for i in v if isinstance(i, int)) for k, v in temp.items()}

это дает мне ошибку TypeError: неподдерживаемые типы операндов для +: 'int' и 'str', тогда я попробовал

   sums = {k: sum(int(i) for i in v) for k, v in [temp.values()]}

тогда я попробовал

  print({k:sum(map(int, [v])) for k, v in temp.items()})

не сработало

получение ошибки:

   TypeError: expected string or bytes-like object

буду признателен за любую помощь


person Hansel Jade    schedule 19.03.2018    source источник
comment
Ваша первая попытка должна пройти без ошибок, но обратите внимание, что вы фильтруете целые числа с помощью if isinstance(i, int). Однако в вашем списке есть только строки.   -  person pylang    schedule 22.03.2018


Ответы (2)


Дано

d = dict([
    ("/history/apollo/", ["6245", "6245", "6245", "6245", "6245", "6245", "6245","6245"]), 
    ("/shuttle/countdown/", ["3985", "3985", "3985", "3985", "3985", "3985", "3985", "-", "-", "-", "0", "3985", "4247", "3985", "3985", "3998", "0", "3985", "3985", "3985", "3985", "4247", "3985", "3985", "398", "3985"]), 
    ("/", ["7074", "7074", "7074", "7074", "7074", "7074", "7074", "7074", "7074", "7074", "70"]),
    ("/images/dual-pad.gif", ["141308", "141308", "0", "141308", "141308", "141308", "0", "141308", "0", "141308", "141308"]),
    ("/images/NASA-logosmall.gif", ["0", "786", "786", "0", "786", "786", "786", "786", "786", "786", "786", "786", "786", "786", "786", "0", "786", "786", "786"])
])

Код

{k: sum(int(x) for x in v if x.isdigit()) for k, v in d.items()}

Выход

{'/': 70810,
 '/history/apollo/': 49960,
 '/images/NASA-logosmall.gif': 12576,
 '/images/dual-pad.gif': 1130464,
 '/shuttle/countdown/': 80635}
person pylang    schedule 22.03.2018
comment
Я использовал совершенно другой подход, который объясняется в моем ответе, но ваш код также отлично работает - person Hansel Jade; 25.03.2018

На самом деле я преобразовал все значения ключа в целое число и заменил дефис на 0, а затем заархивировал их соответствующими ключами.

    a = 0 
    g = []
    a_dict = {}
    with open("log.txt", "r", errors='ignore') as f:
        for line in f:
            test = line.split()[-1]
            if test == '-':
                test = test.replace('-', '0')
                test = int(test)
            else:
                test = int(test)
            g.append(test)
            a = a + 1
    print(a)       
    g

А потом, как только у меня есть такой словарь

dict_items([('/history/apollo/', [6245, 6245, 6245, 6245, 
6245, 6245, 6245,6245]), ('/shuttle/countdown/', [3985, 
3985,3985, 3985,3985, 3985, 3985, 0(#instead of hyphen), 0(#instead of 
hyphen), 0(#instead of hyphen), ...]), ('/', [7074, 7074, 7074, 7074...
('/images/dualpad.gif', [141308, 141308, 0, 141308, 141308,.,.,.]),
('/images/NASA-logosmall.gif', [0, 786, 786, 786, 786, 786, 0, 
786,.,.,.,.])])

тогда я просто добавляю

d = 0
for key in temp:
    temp[key] = [sum(temp[key])]
    d = d + 1
print(temp.items())

вывод:

dict_items([('/history/apollo/', [49960]), (/images/NASA-logosmall.gif', 
[12576]), ('/', [70810]), ('/images/dual-pad.gif', [1130464])...])
person Hansel Jade    schedule 25.03.2018