2

我想遍历多个字典以找到其中的值。如果找到该值,我想要返回值和字典的名称。我已经编写了一个函数来做到这一点,但我不能只提取完整的字典名称。这是代码:

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)

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

4

6 回答 6

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]
于 2013-01-11T13:56:39.307 回答
1

a并且b只是对字典对象的引用,所以每当你使用abpython 实际使用它们指向的对象时。

虽然你可以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)
于 2013-01-11T13:56:42.737 回答
0

如果您真的想要字典的名称,我建议给字典一个'name'键,其中包含字典的“名称”。

a['name'] = 'a'

您还可以a使用对象的“名称”和字典创建一个元组。

a = ('a', some_dict)
于 2013-01-11T13:54:57.120 回答
0

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

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) )
于 2013-01-11T14:16:18.450 回答
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)
于 2013-01-11T14:36:44.697 回答
0

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

于 2013-01-13T17:49:53.170 回答