用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()
nrj asked 2020-07-24T17:10:41Z
7個解決方案
102 votes
Python字典不支持重復鍵。 一種解決方法是將列表或集合存儲在字典中。
一種簡單的方法是使用defaultdict:
from collections import defaultdict
data_dict = defaultdict(list)
您要做的就是更換
data_dict[regNumber] = details
與
data_dict[regNumber].append(details)
您將獲得一個列表字典。
NPE answered 2020-07-24T17:11:15Z
37 votes
您可以在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]}
Scorpil answered 2020-07-24T17:11:40Z
7 votes
您不能使用重復的鍵來定義字典!相反,您可以使用單個鍵,并可以將具有該鍵的元素的列表用作值。
因此,您可以按照以下步驟操作:
查看當前元素的(初始設置的)鍵是否在最終字典中。 如果是,請轉到步驟3
用鍵更新字典
將新值追加到dict [key]列表
重復[1-3]
DonCallisto answered 2020-07-24T17:12:22Z
3 votes
如果只想在必要時使用列表,而在其他情況下只想使用值,則可以執行以下操作:
class DictList(dict):
def __setitem__(self, key, value):
try:
# Assumes there is a list on the key
self[key].append(value)
except KeyError: # If it fails, because there is no key
super(DictList, self).__setitem__(key, value)
except AttributeError: # If it fails because it is not a list
super(DictList, self).__setitem__(key, [self[key], value])
然后,您可以執行以下操作:
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:此實現依賴于{'a': 1, 'b': [2, 3]}方法的不存在(在您存儲的值中)。 如果您存儲的值是列表,則可能會產生意外的結果。 例如,
dl = DictList()
dl['a'] = 1
dl['b'] = [2]
dl['b'] = 3
會產生與{'a': 1, 'b': [2, 3]}之前相同的結果,但可能會期望以下結果:{'a': 1, 'b': [[2], 3]}。
toto_tico answered 2020-07-24T17:13:09Z
2 votes
字典中不能有重復的鍵。 使用列表的字典:
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)
Oskarbi answered 2020-07-24T17:13:29Z
1 votes
您可以參考以下文章:[http://www.wellho.net/mouth/3934_Multiple-identical-keys-in-a-Python-dict-yes-you-can-.html]
在字典中,如果鍵是對象,則不會有重復的問題。
例如:
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}
xiansweety answered 2020-07-24T17:13:58Z
0 votes
我剛剛發布了一個問題的答案,該問題后來作為該問題的重復而被關閉(我認為有充分的理由),但我很驚訝地看到我的建議解決方案未包含在此處的任何答案中。
您可以使用append方法輕松地將值附加到字典中的列表上,而不用使用setdefault或搞亂成員資格測試或手動異常處理:
results = {} # use a normal dictionary for our output
for k, v in some_data: # the keys may be duplicates
results.setdefault(k, []).append(v) # magic happens here!
這很像使用defaultdict,但是您不需要特殊的數據類型。 當您調用setdefault時,它將檢查字典中是否已存在第一個參數(鍵)。 如果找不到任何內容,它將第二個參數(默認值,在這種情況下為空列表)分配為鍵的新值。 如果密鑰確實存在,則不會執行任何特殊操作(默認設置為未使用)。 無論在哪種情況下,都會返回值(無論是舊值還是新值),因此我們可以無條件地對其調用append,因為它應該始終是一個列表。
Blckknght answered 2020-07-24T17:14:28Z