我想循环遍历多个词典以查找驻留在其中的值。如果找到该值,我想要返回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)
任何人都可以帮到这里。我总是在这里找到很好的建议,我期待着一些天才指出如何检索字典的名称。
答案 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)
a
和b
只是对字典对象的引用,所以无论何时使用a
和b
,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的方法,因为它们简单明了且易于实现。我很高兴您帮助我解决了这个问题,我可以解决我的项目。干杯!!