2010-12-15 47 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%。