2013-07-13 62 views
1

我新的編程,因此所有的幫助表示讚賞: 給定樣本字典創建與舊密鑰但子值一個新的字典

d = {0 : (1, 2, 3), 1 : (2, 3, 4), 2 : (5, 6, 7)} 

是建立一個新的字典使用原始密鑰有可能,但鍵的值是值的子值? 即:

0: (1, 2, 3) ---> 0: (4, 5, 6, 7), 1: (5, 6, 7, val(2), val(3))... 

所以我想2,3,因爲他們已經包含在0原始值等被刪除。 *另外,我想只能做的替代ň

從我能理解量,這類似於製作subdict?

的問題是,而不是使用一個給定的字典像上面爲每個按鍵的給定值的一個,我必須這樣做在一個大字典,所以我使用

CNC中

G = {

0:(1,2,3)

1:(3,4,5)

2:(4,5,6)

3:(7,8,9)

...

150:(10,11,12)}

的編輯 -

k = d.keys() 
v = d.values() 

末端
for v in k: 
    print v " is connected to ", d[v]," by 1 length" 

這是一個有點迂迴的方式來顯示鍵和值

CNC中

所以我想提出一個新的字典,新的價值觀是一樣的東西:

G_new = {

0:((3,4,5),(4,5,6),(7,8,9))

1 :((7,8,9),(的值爲4),(的值爲5))

...}

然後只留下唯一值和刪除值包括在密鑰,使得的舊值:

G_new_final = {

0:(4,5, 6,7,8,9)

1:(7,8,9等)

... } #until鍵150

而且因爲我和很多數字的工作,我猜我需要某種功能或字典的理解?

-end of edit-

謝謝!!

+0

我不知道我理解這個問題,如果你有項和值,那麼你必須d的相同呢? – seth

+1

你可以在'd'上發佈這個轉換的實際預期結果嗎? – Jared

+0

我會編輯它! – James

回答

1
g = {0: (1,2,3),1: (3,4,5),2: (4,5,6),3: (7,8,9)} 
g2 = dict() 
for key in g.keys(): 
    old_vals=set(g[key]) 
    new_vals=[] 
    for val in old_vals: 
     try: 
      new_vals.extend(g[val]) 
     except KeyError: 
      pass 
    new_vals = tuple(set(new_vals)-old_vals) 
    g2[key]=new_vals 

>>> g2 
{0: (4, 5, 6, 7, 8, 9), 1: (8, 9, 7), 2:(), 3:()} 

但我不明白這是怎麼從我answered previously?

編輯顯著不同:有趣的是這種方法似乎比館藏的速度更快?

import time 
import random 

def makeg(n): 
    g=dict() 
    for i in xrange(n): 
     g[i] = tuple([random.randint(0,n) for _ in xrange(3)]) 
    return g 

g=makeg(100000) 

def m(g): 
    g2 = dict() 
    for key in g.keys(): 
     old_vals=set(g[key]) 
     new_vals=[] 
     for val in old_vals: 
      try: 
       new_vals.extend(g[val]) 
      except KeyError: 
       pass 
     new_vals = tuple(set(new_vals)-old_vals) 
     g2[key]=new_vals 
    return g2 

s1 = time.time() 
m(g) 
e1 = time.time() 

from collections import defaultdict 

def h(g): 
    a = defaultdict(set) 
    [a[x].update(g.get(y, [])) for x in g for y in g[x]] 
    [a[x].difference_update(g[x]) for x in g] 
    g2={x:tuple(a[x]) for x in a} 
    return g2 

s2 = time.time() 
h(g) 
e2=time.time() 

mt =(e1-s1) 
ht=(e2-s2) 
print mt,ht,mt/ht 

[email protected]:~/so$ python so.py 
0.556298017502 0.850471019745 0.654105789129 
+0

啊是的,我認爲出現的問題是自從我重寫舊字典以來,密鑰的值會變得混雜起來。所以我決定製作一本新字典。但是,謝謝你,你的回答仍然是我最瞭解的人 – James

+0

其實我也想用這個,但是d2變成 d2 = {0:(2,3,4),(5,6,7), (valueof3)...} 但是有沒有辦法讓它合併的數字變成 0:(4,5,6,7,valuesof3) ? – James

+0

好的,我修改了我的答案。 – seth

1
>>> from collections import defaultdict 
>>> a = defaultdict(set) 
>>> d = {0: (1, 2, 3), 1: (2, 3, 4), 2: (5, 6, 7)} 

#all subvalues of the values of x, no duplicate and without any value of key x 
>>> [a[x].update(d.get(y, [])) for x in d for y in d[x]] 
>>> [a[x].difference_update(d[x]) for x in d] 

#convert it dict of tuple values 
>>> {x:tuple(a[x]) for x in a} 
{0: (4, 5, 6, 7), 1: (5, 6, 7), 2:()} 
>>> 
+0

嗨,有沒有一種方法來使用這個沒有給集合確定的值?像我可能想使用 {0:set(d [0])...直到k:set(d [k])} 雖然我懷疑我鍵入的是正確的語法。 – James

+0

我不太明白。其實我並沒有使用任何明確的值。我使用'defaultdict(set)'。在評論中我無法清楚地說出。但是對於'defaultdict(set)',你會得到一個字典,其中包含字典中每個鍵的默認空集。 @詹姆斯 – zhangyangyu

+0

啊是的,對不起,我想我正在閱讀未經編輯的版本。謝謝您的幫助! – James

相關問題