0

たとえば、人々の電話番号、名前、住所を含むテキストファイルがありました。各行の終わりにリターンがあるこのように見えました

555-667282,bill higs,67 hilltop

555-328382,john paul,85 big road

555-457645,zac fry,45 tony's rd

555-457645,kim fry,45 tony's rd

そして、私はそれをすべて辞書に入れたかったのですが、辞書では電話番号がキーで、名前と住所がリストでした。したがって、辞書を印刷したい場合は、次のようになります。これを行うコードは何でしょうか

{555-667282: ['ビル ヒグス','67 ヒルトップ'], 555-328382: ['ジョン ポール','85 ビッグ ロード'], 555-457645: ['ザック フライ','45 トニーズ ロード'] ,['キム フライ','45 トニーの rd']}

4

2 に答える 2

2
dicto = {}

with open('your_file.txt') as f:
    for line in f:
        s_line = line.rstrip().split(',')
        dicto[s_line[0]] = s_line[1:]

編集:

1 つの電話番号に複数のエントリが関連付けられている場合を処理するには:

from collections import defaultdict

dicto = defaultdict(list)

with open('your_file.txt') as f:
    for line in f:
        s_line = line.rstrip().split(',')
        dicto[s_line[0]].append(s_line[1:])
于 2012-06-05T00:36:31.270 に答える
1

このファイル形式はcsv、標準ライブラリのモジュールが処理するように設計されたものです。ただし、辞書キーは1つのものにしかマップできないため、辞書を希望どおりにレイアウトすることはできません。この制限を回避する簡単な方法は、以下のサンプルコードと出力に示すように、各電話番号をリストのリストにマップすることです。

import csv

result = {}
with open('numbers.txt', 'rb') as input:
    for phone_number, name, address in csv.reader(input):
        if phone_number in result:
            result[phone_number] += [[name, address]]
        else:
            result[phone_number] = [[name, address]]

print result

出力:

{'555-328382': [['john paul', '85 big road']], 
 '555-457645': [['zac fry', "45 tony's rd"], ['kim fry', "45 tony's rd"]], 
 '555-667282': [['bill higs', '67 hilltop']]}

内部ループ内のコードは、のサブクラスであるforと呼ばれる別の標準ライブラリクラスを使用して簡略化できます。存在しない値が参照されるたびに、辞書エントリを指定されたデフォルト値に自動的に初期化します。この例にどのように適用できるかを次に示します。defaultdictdict

import collections
import csv

result = collections.defaultdict(list)
with open('numbers.txt', 'rb') as input:
    for phone_number, name, address in csv.reader(input):
        result[phone_number] += [[name, address]]

print result

2番目のバージョンの出力:

defaultdict(<type 'list'>, {
 '555-328382': [['john paul', '85 big road']],
 '555-457645': [['zac fry', "45 tony's rd"], ['kim fry', "45 tony's rd"]],
 '555-667282': [['bill higs', '67 hilltop']]})

defaultdictそれ以外の点では、オブジェクトは、コードの残りの部分で通常の辞書と同じように使用できます。

于 2012-06-05T01:56:04.717 に答える