2

複数の辞書をループして、そこにある値を見つけたいと思います。値が見つかった場合は、値とdictの名前を返します。それを行う関数を作成しましたが、完全な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)

辞書全体を返すのではなく、その名前だけを返したいので、他の値がどこから来ているのか、つまり最後の2つの数値がわかります。

そして、これは私がそれをどのように見せたいかです:

>>> ('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

abは辞書オブジェクトへの参照にすぎません。したがって、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

どうもありがとうございました。本当に価値のある結果がいくつかありますが、単純明快で実装が簡単なので、ilmiacs、volatility、および root のアプローチが特に気に入っています。あなたがこの問題を解決してくれたことをうれしく思います。私は自分のプロジェクトに取り組むことができます。乾杯 !!

于 2013-01-13T17:49:53.170 に答える
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) )
于 2013-01-11T14:16:18.450 に答える
0

関数のキーワード引数として辞書を使用します。

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 に答える