2013-05-31 4 views
0

Я использую Python 2.6 токовый выходпитона список соответствия пунктов

mylist = [('log:A', '1009.2'), ('log:B', '938.1'), ('log:C', '925.7'), ('log:C', '925.7')] 

i'am пытается добавить значения для получения последующих: Занимает высшего к низшему. Проблема, с которой я сталкиваюсь, добавляет все, что связано с тегом log: C. и не выводить его дважды.

log:C = 1851.4 
log:A = 1009.2 
log:B = 938.1 
+1

почему вы изменили вход? Ниже приведены три ответа на основе вашего предыдущего ввода. –

+0

Я понял, что окончательный результат, который дал мне файл, был в списке. – user2371027

+0

Тогда как принятый ответ решает ваш новый вход? –

ответ

3

Использование collections.defaultdict:

>>> strs = "log:A 22 log:B 44 log:C 74 log:D 24 log:B 10" 
>>> from collections import defaultdict 
>>> dic = defaultdict(int) 
>>> it = iter(strs.split()) 
>>> for k in it: 
...  dic[k] += int(next(it)) 
...  
>>> for k,v in sorted(dic.items(), key = lambda x: x[1], reverse = True): 
...  print k,v 
...  
log:C 74 
log:B 54 
log:D 24 
log:A 22 

Чтобы получить отсортированный список элементов на основе значений:

>>> sorted(dic.items(), key = lambda x: x[1], reverse = True) 
[('log:C', 74), ('log:B', 54), ('log:D', 24), ('log:A', 22)] 

Update: Основываясь на новом входе

>>> mylist = [('log:A', '1009.2'), ('log:B', '938.1'), ('log:C', '925.7'), ('log:C', '925.7')] 
>>> dic = defaultdict(int) 
>>> for k,v in mylist:                   
     dic[k] += float(v) 
...  
>>> sorted(dic.items(), key = lambda x: x[1], reverse = True) 
[('log:C', 1851.4), ('log:A', 1009.2), ('log:B', 938.1)] 
+0

спасибо @ Ashwini Chaudhary У меня проблемы с Dicts – user2371027

+0

@ user2371027 Я обновил свое решение основанный на вас новый вход. –

+0

ты такой босс @ Ашвини Чаудхари, теперь я могу проверить всю статистику своей онлайн-хоккейной игры, просто просмотрев два псевдонима. скоро 10 лучших будут работать и благодаря вам! :) http: www.thetutoria.com/cgi-bin/statistics.py, если вы хотите проверить это. – user2371027

2
mystr = 'log:A 22 log:B 44 log:C 74 log:D 24 log:B 10' 

li=mystr.split() 

res={} 
for k,v in zip(li[::2],li[1::2]): 
    res.setdefault(k,[]).append(int(v)) 

print res 

Печать:

{'log:D': [24], 'log:A': [22], 'log:C': [74], 'log:B': [44, 10]} 

Тогда просто суммируют их:

for k in sorted(res): 
    print k, sum(res[k]) 

Печать:

log:A 22 
log:B 54 
log:C 74 
log:D 24 
+2

Собственно, 'sum (['44', '10'])' даст вам следующее: 'TypeError: неподдерживаемый тип операндов для +: 'int' и 'str''. Это решение не будет работать, если вы сначала не сделаете сопоставление с float (а не целыми числами, см. Вопрос). Но в целом все в порядке. – Tadeck

+0

@Tadeck: контроль версий ... Исправлено. Спасибо – dawg

0
import collections 
import operator 

mystr = "log:A 22 log:B 44 log:C 74 log:D 24 log:B 10" 
s = mystr.split() 
d = collections.defaultdict(int) 
for i in xrange(0, len(s), 2): 
    d[s[i]] += int(s[i+1]) 
# alternate way: 
# i = iter(s) 
# for k, v in itertools.izip(i, i): 
#  d[k] += int(v) 
result = sorted(d.iteritems(), key=operator.itemgetter(1), reverse=True) 
# [('log:C', 74), ('log:B', 54), ('log:D', 24), ('log:A', 22)] 
Смежные вопросы