以递归方式检查密钥的存在并附加到dict数组

时间:2015-03-27 16:13:16

标签: python dictionary

我有一个dict如下

{
   "key1" : "value1",
   "key2" : "value2",
   "key3" : "value3",
   "key4" : {
       "key5" : "value5"
   }
}

如果dict有key1 == value1,我会将dict附加到列表中。

假设key1 == value1不存在于第一个键值对中,而它位于嵌套dict中,如下所示:

{
   "key2" : "value2",
   "key3" : "value3",
   "key4" : {
       "key5" : "value5",
       "key1" : "value1",
       "key6" : { 
          "key7" : "value7",
          "key1" : "value1"
       }
   },
   "key8" : { 
       "key9" : "value9",
       "key10" : {
            "key11" : "value11",
            "key12" : "value12",
            "key1" : "value1"
       }
   }
}

在上面的dict中,我先检查是否有key1 = value1。如果没有,我将遍历嵌套的dict,如果它在嵌套的dict中找到,我将把该dict追加到列表中。如果嵌套的dict也是一个嵌套的dict,但是key1 = value1是在第一个键值对中找到的,那么就不需要检查内部的dict(例如,key4在第一个键值对中有key1 = value1。因此不需要检查内部的一个事件虽然key6有key1 = value1)。

最后,我将列出如下列表。

[
   {
       "key5" : "value5",
       "key1" : "value1",
       "key6" : { 
          "key7" : "value7",
          "key1" : "value1"
       }
   },
   {
            "key11" : "value11",
            "key12" : "value12",
            "key1" : "value1"
   }
]

如何实现这一目标? 注意:字典的深度可能会有所不同

1 个答案:

答案 0 :(得分:3)

如果dict包含key1value1,我们会将其添加到列表中并完成。 如果没有,我们将进入dict中dict的所有值并执行相同的逻辑

l = []
def append_dict(d):
    if d.get("key1") == "value1":
        l.append(d)
        return

    for k,v in d.items():
        if isinstance(v, dict):
            append_dict(v) 


append_dict(d)
print l

迭代解决方案将添加我们要检查的字典的队列:

from Queue import Queue
q = Queue() 
l = []
q.put(d)
while not q.empty():
    d = q.get()
    if d.get("key1") == "value1":
        l.append(d)
        continue
    for k,v in d.items():
        if isinstance(v, dict):
            q.put(v) 

print l

正如@shashank所指出的那样,使用stack代替queue也行不通 在字典中搜索是BFS vs DFS