python中的词典搜索列表

python中的词典搜索列表,python,dictionary,Python,Dictionary,我有这段python代码,用于使用点符号访问字典元素 foo = { "bar" : { "baz" : [ {"boo" : "hoo"} , {"baba" : "loo"} ] } } 上面的代码工作得很好,但我想比较dictionary的值和out索引值,如下所示 if foo.bar.baz.baba == "loo&qu

我有这段python代码,用于使用点符号访问字典元素

foo = {
    "bar" : {
        "baz" : [ {"boo" : "hoo"} , {"baba" : "loo"} ]
    }
}
上面的代码工作得很好,但我想比较dictionary的值和out索引值,如下所示


if foo.bar.baz.baba == "loo":
    print("True")
基本上,它必须在列表中的所有对象中进行内部搜索。 为获得该结果,应进行哪些更改。

类映射(dict):
定义初始化(self,*args,**kwargs):
对于args中的arg:
如果存在(arg,dict):
对于参数项()中的k,v:
self[k]=self.\u转换(v)
如果是kwargs:
对于k,v在kwargs.items()中:
self[k]=self.\u转换(v)
def _转换(自身,v):
如果存在(v,dict):
返回自我。转换指令(v)
如果isinstance(v,(列表,元组)):
返回自我。转换列表(v)
如果isinstance(v,(str,int,float,bool)):#返回未修改的基本类型
返回v
raise TypeError#如果传递了其他类型,将引发异常
定义转换指令(自身,dct):
返回映射(dct)
定义转换列表(自身、lst):
#列表和元组可能是基本元素,在这种情况下,我们希望保留它们
#因为它们是可转换类型,或者是映射可转换类型,在这种情况下,我们希望合并所有它们
m=Map()
剩余=[]
对于lst中的v:
v=自转换(v)
如果存在(v,Map):
m、 更新(五)
其他:
rest.append(v)
#TODO:如果我们有一个包含这两种元素的列表,我们必须决定要做什么
如果len(m)和len(剩余):
升值误差
如果len(m):
返回m
回程休息
def _ugetattr _;(self,attr):
返回self.get(attr)
定义设置属性(自身、键、值):
self.\uuuu设置项(键、值)
def _; delattr __;(自身,项目):
自备物品(项目)
用法:

foo=Map({
“酒吧”:{
“baz”:[{“boo”:“hoo”},{“baba”:[1,2]}]
}
})
foo.bar.baz.baba#[1,2]
在评论中,要求将DICT列表的合并行为替换为键的增量整数后缀,这可以通过以下方法替换
\uuuu convert\u list
方法实现:

def\uu转换列表(self,lst):
#列表和元组可能是基本元素,在这种情况下,我们希望保留它们
#因为它们是可转换类型,或者是映射可转换类型,在这种情况下,我们希望合并所有它们
m=Map()
剩余=[]
对于lst中的v:
v=自转换(v)
如果存在(v,Map):
对于键,v.items()中的值:
如果输入m:
i=1
而n中的键+str(i):
i+=1
m[key+str(i)]=值
其他:
m[键]=值
其他:
rest.append(v)
#TODO:如果我们有一个包含这两种元素的列表,我们必须决定要做什么
如果len(m)和len(剩余):
升值误差
如果len(m):
返回m
回程休息

如何修改您的
\uu convert
方法来创建一个合并的
映射
isntead的
列表
映射s?这是一种非常低效的方法,顺便说一句,实际上您的内存需求增加了一倍。没有很好的理由去实现
\uuuuu setitem\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。还有其他方法removed@Adirio是的,合并会起作用,我将
v[elem]=Map(v[elem])
替换为
v=Map({k:v代表k,v在v[elem].items()})
。它似乎不正确。@Mohan您必须返回
映射
,并将其分配到调用函数的位置:
v=self.\uu convert(v)
@juanpa.arrivillaga我认为此解决方案消除了所有内存重复和不必要的调用,但是,您介意检查吗?没错,
dict={“email”:[{“type”:“家”、“价值”:abc@gmail.com},{“类型”:“其他”,“值”:def@gmail.com“}]}
导致
{'emails':{'type':'other','value':'def@gmail.com'}}
这是不正确的。您在评论中说,在数组中合并dict是一个有效的解决方案。您在这里写的示例是不可合并的,因为它们共享密钥,并且密钥不能在dict中复制,最后的值将被保留,之前的值将被删除。在您的示例中,
dict.emails.type
是什么因为
dicti.emails[0]。type
是“home”,而
dicti.emails[1]。type
是“other”。对不起,我的用例中的数组将具有相同键的对象,就像Pardon me一样,我的用例中的数组将具有相同键的对象,就像
type:“other”
type:“home”“
。更新将替换重复项。可以做出哪些改变。

if foo.bar.baz[1].baba == "loo":
    print("True")

if foo.bar.baz.baba == "loo":
    print("True")