1

ファイル names.dat は次のようになります。

Fry, Philip J.;999 111-1111;999 222-2222  
Rodriguez, Bender B.;999 333-3333;999 444-4444  
Farnsworth, Professor;999 555-5555;999 666-6666  
Leela, Turanga;999 777-7777;999 888-8888  
Wong, Amy;999 999-9999;999 101-1010

以下のコードは、印刷された結果を下部に表示します。私がやりたいことは、ユーザーが変更したいレコードを番号で選択できるようにするメニュー駆動型のプログラムを作成することです。擬似コードでは、次のようになります。

  • 番号付きの電話リストを含むコードの最初のブロックはここにあります
  • 変更するレコードを番号で入力します
  • ユーザーが 3 を入力
  • Rodriguez の場合、Bender B は ac を入力して携帯電話を変更するか、h を入力して自宅の電話を変更します
  • ユーザーが h を入力します
  • スペースなしで 10 桁の電話番号を入力してください
  • ユーザーは 7771234567 を入力します
  • レコードが変更される
  • p を入力して、変更された電話帳を表示します (すべてのレコードが表示されますが、Bender の電話は異なります)。
  • 別の変更を行いますか?はいの場合は y、いいえの場合は n

私の問題は、主キーを入力したユーザー番号にバインドする方法が見つからないことです。Python辞書には順序がないため、これを行うのは難しいと思います。誰か助けてくれませんか?それだけが必要で、あとは自分でできる。

pBook = {}  
fp = open('names.dat')  

# populate pBook  
while 1:  
    line = fp.readline()  
    if not line:  
        break  
x = line[:-1]  
data = x.split(';')  
pBook[data[0]] = {'home': data[1], 'cell': data[2]}  
fp.close()  

# optional if you want to see the dictionary structure   
# print pBook  

i = 1  
print '\nPhone listings:\n'  
for record in pBook:  
    key = str(i)  
    i += 1  
    print key + ')', record + ':', 'Home', pBook[record]['home'] + ',', 'Cell', pBook[record]['cell']  
print ''  

電話リスト:

  1. ファーンズワース教授: ホーム 999 555-5555、セル 999 666-6666
  2. フライ、フィリップ J.: ホーム 999 111-1111、セル 999 222-2222
  3. ロドリゲス、ベンダー B.: ホーム 999 333-3333、セル 999 444-4444
  4. ウォン、エイミー: ホーム 999 999-9999、セル 999 101-1010
  5. リーラ、トゥランガ: 自宅 999 777-7777、セル 999 888-8888

pBook にデータが入力された後に印刷した結果は、この投稿用にフォーマットされているため、構造が理解しやすくなっています。主キーは人の名前で、値は別の辞書で、'cell' と 'home' がキーで、電話番号がそれぞれの値です。

{  
'Farnsworth, Professor': {'cell': '999 666-6666', 'home': '999 555-5555'},  
'Fry, Philip J.': {'cell ': '999 222-2222', 'home': '999 111-1111'},  
'Rodriguez, Bender B.': {'cell': '999 444-4444', 'home': '999 333-3333'},  
'Wong, Amy' : {'cell': '999 101-1010', 'home': '999 999-9999'},  
'Leela, Turanga': {'cell': '999 888-8888', 'home': '999 777-7777'}  
}  
4

3 に答える 3

1

設計全体が間違っていると思いますが、巨大な電話帳を作成することになると、それを印刷してユーザーに選択させることに何の意味もないと思います。

ただし、名前とユーザーの選択 (番号) をバインドする場合は、ユーザーに出力するときに辞書を作成できます。

user_choices = {}
i = 1  
print '\nPhone listings:\n'  
for record in pBook:  
    key = i
    user_choices[key] = record 
    i += 1  
    print str(key) + ')', record + ':', 'Home', pBook[record]['home'] + ',', 'Cell', pBook[record]['cell']  
print '' 

次に、ウォン、エイミーの携帯番号を取得するには、次のことができますprint pBook[user_choices[4]]['cell']

于 2012-07-18T13:15:52.947 に答える
0

必要なのは順序付けられた辞書の使用だけである場合collections.OrderedDict

my_dict.keys()[index]Python2.7 では、またはを使用してインデックスでキーまたは値にアクセスできますmy_dict.values()[index]

@mgilson が指摘したように、インデックス作成をサポートしていない ValuesView オブジェクトを返すため、これは 3.0 では機能しませんが、次のようにリストに強制することはできます。

list(my_dict.keys())[index].

于 2012-07-18T13:09:26.733 に答える
0

新しい(python 2.7+)バージョンの python には、順序付けられた辞書タイプがcollections.OrderedDictありますが(私が知る限り)、インデックスでその辞書にアクセスすることはできません。順序付けられたデータ型を辞書と一緒に保持することをお勧めします (リストのように)。次に、インデックスで値を取得したい場合は、 を行うだけですmydict[mylist[i]]。dict をサブクラス化することで、おそらくこれをもう少しきれいにすることができますが、基本的にはそれがアイデアです。

本当に、インデックスでデータを取得したい場合は、とにかくデータ構造として a を使用する方がよいでしょうlist...これには、並べ替えることができ (たとえば、アルファベット順に)、順序を維持できるという利点があります。

于 2012-07-18T13:15:08.737 に答える