【问题标题】:Check existence of a key recursively and append to array of dict递归检查键是否存在并附加到dict数组
【发布时间】:2015-03-27 16:13:16
【问题描述】:

我有一个如下的字典

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

如果字典有 key1==value1,我会将字典追加到列表中。

假设 key1==value1 不在第一个键值对中,而在嵌套字典中,如下所示:

{
   "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。如果没有,我必须遍历嵌套字典,如果它在嵌套字典中找到,我必须将该字典附加到列表中。如果嵌套字典也是嵌套字典,但在第一个键值对中找到 key1=value1,则无需检查内部字典(例如 key4 在第一个键值对中有 key1=value1。因此无需尽管 key6 有 key1=value1),但检查内部的。

所以最后,我将有如下列表。

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

如何做到这一点? 注意:dict的深度可能会有所不同

【问题讨论】:

  • 你有“任意”的深度指令还是只有“可管理”的限制?
  • @syntonym 假设它是任意深度..

标签: python dictionary


【解决方案1】:

如果字典包含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

【讨论】:

  • if d[k] == v 还不够吗?它也是递归的,可能不适用于任意深度字典(因为 python 最大递归深度),但可能仍然足够。
  • 在撰写解释时也注意到了这一点。关于递归,它也会迭代
  • OP 请求递归
  • 真的,Stack vs Queue 将是 DFS vs BFS
  • 好答案。注意:如果要模拟 LIFO 深度优先搜索排序,则应使用 Stack 而不是 Queue。或者使用 Deque 来模拟递归函数的 exact 顺序。队列将进行广度优先搜索。
猜你喜欢
  • 1970-01-01
  • 2014-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多