2016-01-05 118 views
-2

我有几个字典,字典键是元组。在字典中查找嵌套键

每个词典中的键总是相同的长度。

我想查找嵌套的键并打印它们。

字典例如:

dic_1 = { 
    (u'A_String', u'B_String', u'C_String', u'D_String', u'E_String'): 111, 
    (u'A_String', u'B_String', u'C_String', u'D_String' ,u'F_String'): 112 
} 

dic_2 = { 
    (u'A_String', u'B_String', u'C_String', u'D_String'): 300, 
    (u'A_String', u'B_String', u'C_String', u'F_String'): 301, 
} 

dic_3 = { 
    (u'A_String', u'B_String', u'C_String'): 200, 
    (u'A_String', u'B_String', u'F_String'): 201, 
} 
dic_3

第一行嵌套在第一行中dic_2dic_1

dic_2

第一行嵌套在第一行的dic_1

我尝试:

for key in dic_1: 
    print '-',key 
    for k in dic_2: 
     if k in tuple(key): 
      print '--', k 
      for i in dic_3: 
       if i in tuple(k): 
        print '---', i 

回答

3

编辑:快速阅读问题,这是一个可以回答的编辑。

dic_1 = { 
(u'A_String', u'B_String', u'C_String', u'D_String', u'E_String'): 111, 
(u'A_String', u'B_String', u'C_String', u'D_String' ,u'F_String'): 112 
} 


dic_2 = { 
(u'A_String', u'B_String', u'C_String', u'D_String'): 300, 
(u'A_String', u'B_String', u'C_String', u'F_String'): 301, 
} 


dic_3 = { 
(u'A_String', u'B_String', u'C_String'): 200, 
(u'A_String', u'B_String', u'F_String'): 201, 
} 

from itertools import permutations 

dicts = [dic_1, dic_2, dic_3] 
for x, y in permutations(range(len(dicts)), 2): 
    print x, y 
    dic_x = dicts[x] 
    dic_y = dicts[y] 
    for k in dic_x.keys(): 
     for j in dic_y.keys(): 
      if len(set(k) - set(j)) is 0: 
       print 'Key %s of dict %s is contained in key %s of dict %s' % (k, x + 1, j, y + 1) 
       break 

密钥(u'A_String 'u'B_String',u'C_String 'u'D_String ')字典2被包含在密钥(u'A_String',u'B_String',U 'C_String',u'D_String',u'E_String')字典1
字典2的键(u'A_String',u'B_String',u'C_String',u'F_String')包含在键(u '此处a_string',字典1
密钥(u'A_String的u'B_String 'u'C_String',u'D_String 'u'F_String ')',u'B_String',u'F_String')字典的3是包含在 '字典1
密钥(u'A_String的键(u'A_String 'u'B_String',u'C_String 'u'D_String',u'F_String)',u'B_String 'u'C_String' )字典3是conta INED在键(u'A_String 'u'B_String',u'C_String 'u'D_String',u'E_String ')字典的1
密钥(u'A_String',u'B_String 'u'F_String' )字典3的密钥(u'A_String',u'B_String',u'C_String',u'F_String')包含在字典2中
密钥(u'A_String',u'B_String',u'C_String' )字典3被包含在字典2

它的工作原理,通过比较所有的键(u'A_String“ u'B_String”,u'C_String“ u'D_String”),比较由铸造完成到一个集合并做出区别,如果没有元素保留,则元组包含在另一个元素中。

+0

哇!你能评论一下'排列(范围(3),2)'吗?如果我有八本字典?最长的关键长度八和最小的一个,我需要更改参数吗? – Toren

+0

如果您有8个词典:排列(范围(8),2),尝试在for后面添加打印以查看x和y是什么。 – Cyrbil

+0

代码能用一本词典工作吗?找到一个父键(最长的长度),然后键他们是它的子集?我如何改变代码来完成这个任务? – Toren

1

我不知道如何组织你的类型的字典,但以查找是否存在从一个字典的键是另一个字典的关键之内“嵌套”,你可以检查它这样的:

dic_3_keys = dic_3.keys() 
key_len = len(dic_3_keys[0]) 
check_keys = [k[:key_len] for k in dic_1.keys()] 
for key in dic_3_keys: 
    if key in check_keys: 
     print key 
+0

谢谢!这里的想法是否为这两本字典获得相同的关键字长度? – Toren

+0

如果你喜欢比较它们,是的。 – Lukasz

+0

所以我的问题是不同长度的比较键?很好! – Toren