2012-05-19 12 views
28

次のリストは、異なる値を持つ重複した車登録番号を含んでいます。私は車の登録番号のこの複数のキーを受け入れる辞書に変換したい。これまでリストを辞書に変換しようとすると、キーの1つが削除されました。誰かが リスト重複キーで辞書を作成する方法私を見ることができます:pythonで重複するキーを持つ辞書を作る

EDF768, Bill Meyer, 2456, Vet_Parking 
TY5678, Jane Miller, 8987, AgHort_Parking 
GEF123, Jill Black, 3456, Creche_Parking 
ABC234, Fred Greenside, 2345, AgHort_Parking 
GH7682, Clara Hill, 7689, AgHort_Parking 
JU9807, Jacky Blair, 7867, Vet_Parking 
KLOI98, Martha Miller, 4563, Vet_Parking 
ADF645, Cloe Freckle, 6789, Vet_Parking 
DF7800, Jacko Frizzle, 4532, Creche_Parking 
WER546, Olga Grey, 9898, Creche_Parking 
HUY768, Wilbur Matty, 8912, Creche_Parking 
EDF768, Jenny Meyer, 9987, Vet_Parking 
TY5678, Jo King, 8987, AgHort_Parking 
JU9807, Mike Green, 3212, Vet_Parking 

私がしようとしたコードは次のとおりです。

data_dict = {} 
data_list = [] 

def createDictionaryModified(filename): 
    path = "C:\Users\user\Desktop" 
    basename = "ParkingData_Part3.txt" 
    filename = path + "//" + basename 
    file = open(filename) 
    contents = file.read() 
    print contents,"\n" 
    data_list = [lines.split(",") for lines in contents.split("\n")] 
    for line in data_list: 
    regNumber = line[0] 
    name = line[1] 
    phoneExtn = line[2] 
    carpark = line[3].strip() 
    details = (name,phoneExtn,carpark) 
    data_dict[regNumber] = details 
    print data_dict,"\n" 
    print data_dict.items(),"\n" 
    print data_dict.values() 
+6

ディクショナリで関連する値が異なる重複キーが許可されている場合、そのキーの値を後でルックアップするときに取得されると思われるものはありますか? – martineau

答えて

5

あなたが定義のための重複キーを持つ辞書を持つことはできません! Instedでは、単一のキーと、そのキーを持つ要素のリストを値として使用できます。

ですから、これらの手順に従うことができます:現在の要素の(あなたの初期設定の)鍵は、最終的な辞書にある場合

  1. を参照してください。ない場合は、[1-3]
77

Pythonの辞書は重複したキーをサポートしていない新しい価値

  • 繰り返しを一覧表示する[キー]のdictするキー
  • 追加で3
  • 更新辞書に進みます。 。 1つの方法は、リストまたはセットを辞書の中に格納することです。

    from collections import defaultdict 
    
    data_dict = defaultdict(list) 
    

    は、あなたがしなければならないのは、

    data_dict[regNumber].append(details) 
    

    data_dict[regNumber] = details 
    

    を交換され、あなたが得られます。これを達成するために

    一つの簡単な方法は、defaultdictを使用することですリストの辞書。

  • +3

    +1これを行うには良い方法、私はこれを読んだ後、それについてのコードの行を書くことはありません:) – DonCallisto

    +1

    +1自分で書かれた非常に不気味なデータ構造を持っていた。あなたのアプローチを含めても私のデータ構造は気が散っています。しかし、それほど多くはありません:D – user1252280

    +1

    これは本当にいいです。アイデアをありがとう。 –

    1

    辞書にキーを重複させることはできません。リストの一言はどうですか?

    for line in data_list: 
        regNumber = line[0] 
        name = line[1] 
        phoneExtn = line[2] 
        carpark = line[3].strip() 
        details = (name,phoneExtn,carpark) 
        if not data_dict.has_key(regNumber): 
        data_dict[regNumber] = [details] 
        else: 
        data_dict[regNumber].append(details) 
    
    +0

    しかし、' defaultdict'ソリューションはこれを手動で行うよりも優れています(aixの答え) – Oskarbi

    +0

    これはうまくいきます。 'hash_key'の代わりに – nrj

    +1

    に感謝します。私たちは単に' data_dictにregNumberではないのに 'を使うことができます。 –

    29

    pythonで組み込み型の動作を変更することができます。あなたのケースのために、それは自動的に同じキーの下のリストで重複値を格納しますdictのサブクラスを作成するのはとても簡単です:

    class Dictlist(dict): 
        def __setitem__(self, key, value): 
         try: 
          self[key] 
         except KeyError: 
          super(Dictlist, self).__setitem__(key, []) 
         self[key].append(value) 
    

    アウトは例を置く:

    >>> d = dictlist.Dictlist() 
    >>> d['test'] = 1 
    >>> d['test'] = 2 
    >>> d['test'] = 3 
    >>> d 
    {'test': [1, 2, 3]} 
    >>> d['other'] = 100 
    >>> d 
    {'test': [1, 2, 3], 'other': [100]} 
    
    +3

    'try:'/'KeyError:'以外の 'selfではないキー'だけではないのはなぜですか? –

    +0

    と同じこれはない: '[試験 ']。追加(1) D [' テスト ']。追加(2) D [' テストコレクションからdefaultdict D = defaultdict(リスト) Dをインポート' '] .append(3)' または何かを逃してもいいですか? –

    0

    あなたがにしたい場合は、場合にのみ、リストを持っていますあなたはその後、次の操作を行うことができます

    class DictList(dict): 
        def __setitem__(self, key, value): 
         try: 
          # Assumes there is a list on the key 
          self[key].append(value) 
         except KeyError: # if fails because there is no key 
          super(DictList, self).__setitem__(key, value) 
         except AttributeError: # if fails because it is not a list 
          super(DictList, self).__setitem__(key, [self[key], value]) 
    

    :DOthis彼らは必要であり、それ以外の場合の値は、次のことができます

    dl = DictList() 
    dl['a'] = 1 
    dl['b'] = 2 
    dl['b'] = 3 
    

    {'a': 1, 'b': [2, 3]}が格納されます。上記と同じ出力を生成します

    my_dict = {1: 'a', 2: 'b', 3: 'b'} 
    rev = DictList() 
    for k, v in my_dict.items(): 
        rev_med[v] = k 
    

    {'a': 1, 'b': [2, 3]}


    は、私は単純にやる、その場合にはリバース/逆辞書を、持っているしたい場合は、この実装を使用する傾向があります。


    CAVEAT:この実装は、(あなたが保存されている値で)append法の非存在に依存しています。格納している値がリストの場合は、が予期しない結果になることがあります。例えば、

    dl = DictList() 
    dl['a'] = 1 
    dl['b'] = [2] 
    dl['b'] = 3 
    

    {'a': 1, 'b': [2, 3]}前と同じ結果を生成しますが、一つは次のことを期待されることがあります{'a': 1, 'b': [[2], 3]}

    関連する問題