82

次のリストには、値が異なる重複した自動車登録番号が含まれています。この自動車登録番号の複数のキーを受け入れる辞書に変換したいと考えています。

これまでのところ、リストを辞書に変換しようとすると、キーの 1 つが削除されます。重複キーを持つ辞書を作成するにはどうすればよいですか?

リストは次のとおりです。

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()
4

9 に答える 9

139

Python 辞書は重複キーをサポートしていません。1 つの方法は、辞書内にリストまたはセットを格納することです。

これを実現する簡単な方法の 1 つは、次を使用することdefaultdictです。

from collections import defaultdict

data_dict = defaultdict(list)

あなたがしなければならないのは交換することだけです

data_dict[regNumber] = details

data_dict[regNumber].append(details)

リストの辞書が得られます。

于 2012-05-19T11:41:15.263 に答える
48

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]}
于 2012-05-19T12:42:38.843 に答える
9

定義のために重複したキーを持つ dict を持つことはできません! 代わりに、単一のキーと、そのキーを持つ要素のリストを値として使用できます。

したがって、次の手順に従うことができます。

  1. 現在の要素の (初期セットの) キーが最終辞書にあるかどうかを確認します。ある場合は、手順 3 に進みます
  2. キーで辞書を更新する
  3. 新しい値を dict[key] リストに追加します
  4. [1-3]を繰り返す
于 2012-05-19T11:40:59.913 に答える
8

次の記事を参照できます: http://www.wellho.net/mouth/3934_Multiple-identical-keys-in-a-Python-dict-yes-you-can-.html

dict では、キーがオブジェクトである場合、重複の問題はありません。

例えば:

class p(object):
    def __init__(self, name):
        self.name = name
    def __repr__(self):
        return self.name
    def __str__(self):
        return self.name
d = {p('k'): 1, p('k'): 2}
于 2018-09-06T13:24:55.780 に答える
3

ディクショナリに重複したキーを含めることはできません。リストの dict を使用します。

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)
于 2012-05-19T11:50:22.793 に答える