0

ユーザーからの入力を取得する辞書内の辞書にデータを入力したい。これは私のコードです:

n= int(raw_input("Enter no of customers:"))

d={}
d1={}
d2={}

for i in range(n):
    print "Enter Details for customer-{}".format(i+1)
    s="Customer-{}".format(i)
    #print s
    #print type(s)
    d1["Name"]=raw_input("Enter Name:")
    d1["Phone"]=long(raw_input("Enter Phone:"))
    d1["Tab"]=float(raw_input("Enter Tab:"))

    d2["Address-1"]=raw_input("Enter Address-1:")
    d2["Address-2"]=raw_input("Enter Address-2:")
    d2["State"]=raw_input("Enter State:")

    d1["Address"]=d2    

    d[s]=d1
    #print d

print d


for k,v in d.iteritems():
    print k

    for k1,v1 in d1.iteritems():
        if k1=="Address":
        print "\tAddress:"

        else:
            print "\t",k1,":",v1

    for k2,v2 in d2.iteritems():
        print "\t\t",k2,":",v2

私が直面している問題は、データを上書きしていることであり、その理由を理解できません。

出力は次のとおりです。

Customer-1
Phone : 433
Name : ggg
Tab : 433.0
Address:
State : 434
Address-2 : 443
Address-1 : 4343

Customer-0
Phone : 433
Name : ggg
Tab : 433.0
Address:
State : 434
Address-2 : 443
Address-1 : 4343

Customer-2
Phone : 433
Name : ggg
Tab : 433.0
Address:
State : 434
Address-2 : 443
Address-1 : 4343

どうぞ、どんな助けでも大歓迎です!

4

1 に答える 1

1

ループで新しい辞書を作成する必要があります。

d={}

for i in range(n):
    d1={}
    d2={}

そうしないと、同じオブジェクトを割り当て続け、ループ内で何度も変更します。

コピーではなく、既存の辞書への参照のみを保存していました。dディクショナリへの複数の参照を作成でき、それらすべての参照を通じて変更が表示されます。

>>> foo = {}
>>> bar = foo
>>> foo['eggs'] = 'ham'
>>> bar
{'eggs': 'ham'}
>>> foo['eggs'] = 'spam'
>>> bar
{'eggs': 'spam'}

式は の特定のキーの下にd[s]=d1への参照のみを格納し、それらの参照はすべて同じオブジェクトを指しています。and行をループに移動することで、繰り返しごとに新しい辞書を作成します。d1dd1 = {}d2 = {}

新しいディクショナリへの参照を確実に作成するもう 1 つの方法は、dict.copy()メソッドを使用してそのコピーを作成することですが、ここで新しいディクショナリを作成することをお勧めします。

変数にもっと良い名前を付けたいと思うかもしれません。dd1andの代わりに、おそらく、andd2を使用したいでしょう。customerscustomeraddress

于 2013-08-30T11:25:53.840 に答える