2013-07-13 58 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

相关问题