循环遍历多个词典并获取值为dict的dict的名称

时间:2013-01-11 13:46:05

标签: python

我想循环遍历多个词典以查找驻留在其中的值。如果找到该值,我想要返回dict的值和名称。我写了一个函数来做它,但我不能只提取完整的字典名称。这是代码:

a = {1: ((1,1),999), 2: ((2,2),998), 3:((3,3),998)}
b = {1: ((4,4),997), 5:((5,5),996)}

def retOBJECT(tup):
    for l in [a,b]:
        for v in l:
            if tup in l[v]:
                return l,v,l[v][1]

print retOBJECT((1,1))

>>> 
({1: ((1, 1), 999), 2: ((2, 2), 998), 3: ((3, 3), 998)}, 1, 999)

我不希望返回整个字典,只返回其名称,因此我知道其他值的来源,即最后两个数字。

这就是我想要它的样子:

>>> ('a', 1, 999)

任何人都可以帮到这里。我总是在这里找到很好的建议,我期待着一些天才指出如何检索字典的名称。

6 个答案:

答案 0 :(得分:1)

def retOBJECT(tup):
    for l_name, l in [('a',a),('b',b)]:
        for v in l:
            if tup in l[v]:
                return l_name, v,l[v][1]

答案 1 :(得分:1)

ab只是对字典对象的引用,所以无论何时使用ab,python实际上都会使用它们指向的对象。

虽然您可以使用globals()来实现您的目标,但我不知道您为什么要这样做:

  

globals() - >字典

     

返回包含当前范围的全局变量的字典。

In [110]: globals()['a']
Out[110]: {1: ((1, 1), 999), 2: ((2, 2), 998), 3: ((3, 3), 998)}

In [111]: def retOBJECT(tup):
        for l in ['a','b']:
                for v in globals()[l]:
                        if tup in globals()[l][v]:
                                return l,v,globals()[l][v][1]
   .....:             

In [112]: print retOBJECT((1,1))
('a', 1, 999)

In [113]: print retOBJECT((2,2))
('a', 2, 998)

In [114]: print retOBJECT((5,5))
('b', 5, 996)

答案 2 :(得分:0)

如果你真的想要dict的名字,我会建议给字典一个'name'密钥,该密钥包含字典的'name'。

a['name'] = 'a'

你也可以使a元组成为对象的'name'和dict。

a = ('a', some_dict)

答案 3 :(得分:0)

我认为推荐的方法是将整个数据结构包装在dict中,例如:

names = {}
names["a"] = {1: ((1,1),999), 2: ((2,2),998), 3:((3,3),998)}
names["b"] = {1: ((4,4),997), 5:((5,5),996)}

def ret_name(tup):
    for k1, v1 in names.iteritems():
        for k2, v2 in names[k1].iteritems():
            if v2[0]==tup:
                return names[k1], k1, names[k1][k2][1]


print ret_name( (1,1) )
print ret_name( (5,5) )

答案 4 :(得分:0)

使用您的dicts作为函数的关键字参数:

a = {1: ((1,1),999), 2: ((2,2),998), 3:((3,3),998)}
b = {1: ((4,4),997), 5:((5,5),996)}

def ret_obj(tpl,**kwargs):
    for k,v in kwargs.iteritems():
        for k2,v2 in v.iteritems():
            if tpl in v2:
                return (k,k2,v2[1])

ret_obj((1,1),a=a,b=b)
#returns ('a', 1, 999)

答案 5 :(得分:0)

非常感谢你们。有一些非常有价值的结果,但我明确地喜欢ilmiacs,volatility和root的方法,因为它们简单明了且易于实现。我很高兴您帮助我解决了这个问题,我可以解决我的项目。干杯!!