2010-12-15 48 views
0

我有一个像总字典物品进入汇总结果

mydict={ 
     (a,1):0, 
     (a,2):0, 
     (a,3):0, 
     (a,4):1, 
     (a,5):2, 
     (a,6):2, 
     (a,7)=0, 
     (a,8)=0,   
} 

字典我想总结一下中

mysummarydict={ 
    (a,1,3):0, 
    (a,4,4):1, 
    (a,5,6):2, 
    (a,7,8):0 
    } 

这些值是从大约间隔的数据集不重叠,但可以有差距。第一个词典现在每个单一点都有一个条目,我想要得到第二个词典,其中包含共享共同价值的相邻点的摘要。你能指导我在Python 2.6中的最佳解决方案吗? 感谢

+3

这些不是Python字典;它们甚至不是Python中的有效表达式。 – infrared 2010-12-15 19:41:15

+0

'(a,2)= 0'行怎么样? – robert 2010-12-15 19:41:51

+0

这看起来不像蟒蛇。什么是? 2发生了什么?字典的关键和价值是什么? – 2010-12-15 19:42:38

回答

2
from itertools import groupby 
from operator import itemgetter 

mydict={ 
     ('a', 1): 0, 
     ('a', 2): 0, 
     ('a', 3): 0, 
     ('a', 4): 1, 
     ('a', 5): 2, 
     ('a', 6): 2, 
     ('a', 7): 0, 
     ('a', 8): 0,   
} 

data = mydict.items() 
data.sort() 

def groupkey(item): 
    return item[0][0], item[1] 

result = {} 
for v, group in groupby(data, key=groupkey): 
    char, value = v 
    nums = [item[0][1] for item in group] 
    result[char, min(nums), max(nums)] = value 

print result 

结果:

{ 
('a', 1, 3): 0 
('a', 4, 4): 1, 
('a', 5, 6): 2, 
('a', 7, 8): 0, 
} 
+0

'(char,value),...在...中的组 - 可能更好? – katrielalex 2010-12-15 20:09:10

+0

感谢您的回答。它的效果很好,但我想我的第一遍中我的问题还不够清楚。我更新了这个问题以更好地代表需求。你的答案为每个原始值输出一个间隔,但我需要一些与现在问题中描述的有所不同的东西。 – biomed 2010-12-15 20:13:44

+1

@biomed:将'return item [0] [0],item [1],item [0] [1]'更改为'return item [0] [1]'。 – katrielalex 2010-12-15 20:18:49

0

如果您在列表中存储这些数据,而不是,它变得更加容易:

from itertools import groupby 
from operator import itemgetter 

mylist = [0, 0, 0, 1, 2, 2, 0, 0] 

def interval(v): 
    head = tail = next(v) 
    for tail in v: 
     pass 

    return head[0] + 1, tail[0] + 1 

print({interval(v): k for k, v in groupby(enumerate(mylist), key=itemgetter(1))}) 

{(5, 6): 2, (1, 3): 0, (7, 8): 0, (4, 4): 1} 
+0

如果不清楚,'interval'返回迭代中的第一个和最后一个位置值(带有fencepost修正)。 – katrielalex 2010-12-15 21:27:00

0

我发现更短和更快的方法:

from itertools import groupby 
from operator import itemgetter 
from time import clock 

mydict={('a', 1): 0, 
     ('a', 2): 0, 
     ('a', 3): 0, 
     ('a', 4): 1, 
     ('a', 5): 2, 
     ('a', 6): 2, 
     ('a', 7): 0, 
     ('a', 8): 0, 
     } 

A,B,C = [],[],[] 

for i in xrange(1000): 

    t0 = clock() 
    data = mydict.items() 
    data.sort() 
    def groupkey(item): 
     return item[0][0], item[1] 
    result1 = {} 
    for v, group in groupby(data, key=groupkey): 
     char, value = v 
     nums = [item[0][1] for item in group] 
     result1[char, min(nums), max(nums)] = value 
    A.append(clock()-t0) 

    #---------------------------------------------------------------- 

    t0 = clock() 
    data = [ [a,b,c] for ((a,b),c) in mydict.items()] 
    data.sort() 
    result2 = {} 
    for (char,value),group in groupby(data, key=itemgetter(0,2)): 
     nums = [item[1] for item in group] 
     result2[char,nums[0],nums[-1]] = value 
    B.append(clock()-t0) 

    #----------------------------------------------------------------- 

    t0 = clock() 
    data = [ [a,b,c] for ((a,b),c) in mydict.items()] 
    data.sort() 
    result3 = {} 
    for ((char,value),nums) in [ (cle,[item[1] for item in group]) for cle,group in groupby(data, key=itemgetter(0,2))]: 
     result3[char,nums[0],nums[-1]] = value 
    C.append(clock()-t0) 

print 'result1==',result1 
print 'result2==',result2 
print 'result3==',result3 
print 'result1==result2==result3==',result1==result2==result3 
print id(result1)==id(result2),id(result2)==id(result3),id(result3)==id(result1) 


print '{:.1%}.'.format(min(B)/min(A)) 
print '{:.1%}.'.format(min(C)/min(A)) 

结果:

RESULT1 == {( '一个',5,6):2,( '一个',4,4):1,( '一个', ('a',4,4):0,('a',1,3):0}

result2 == { ,('a',7,8):0,('a',1,3):0}

result3 == {('a',5,6}:2,('a', 4,4):1,('a',7,8):0,('a',1,3):0}

result1 == result2 == result3 == True

假假假

87.0%。

93.2%。