python不能創建字典的是_用Python創建帶有重復鍵的字典

用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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370671.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370671.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370671.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python中int是什么的縮寫_python中int是什么類型

python中的基本數據類型1:雖然python中的變量不需要聲明,但使用時必須賦值整形變量浮點型變量字符型2:可以一個給多個變量賦值,也可以多個給多個變量賦值3:python3中有6個標準數據類型Number(數字)*True1*False0*數值的除法(/)總是返回一個浮點數&#x…

redis cli命令

redis安裝后,在src和/usr/local/bin下有幾個以redis開頭的可執行文件,稱為redis shell,這些可執行文件可做很多事情。 可執行文件作用redis-server 啟動redisredis-cliredis命令行工具redis-benchmark基準測試工具redis-check-aofAOF持久化文…

高級ZK:異步UI更新和后臺處理–第2部分

介紹 在第1部分中,我展示了如何在ZK應用程序中使用服務器推送和線程來執行后臺任務。 但是,這個簡單的示例具有一個重大缺陷,這使其對于實際應用程序而言是一種不好的方法:它為每個后臺任務啟動了一個新線程。 JDK5引入了Execut…

css清除浮動的原理

最近學習css發現了高度塌陷時候要清除浮動,為了理解清楚浮動原理,網上找了不少資料,發現都寫的不是很清楚,而且都是一模一樣的內容,我在里分享一下我對清楚浮動原理的理解, 如果你已經很了解什么是浮動和浮動的效果你可以直接跳轉到三.如何清除浮動(重點)閱讀 一.什么是浮動首…

SpringBoot03 項目熱部署

1 問題 在編寫springBoot項目時,經常需要修改代碼;但是每次修改代碼后都需重新啟動,修改的代碼才會生效 2 這么實現IDEA能夠像Eclipse那樣保存過后就可以自動進行刷新呢 將springBoot項目進行熱部署即可 3 如何實現SpringBoot項目的熱部署01 …

STM32實現流水燈

led.c #include"led.h"void Led_Init(void) {GPIO_InitTypeDef GPIO_VALUE; //???RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//???GPIO_VALUE.GPIO_ModeGPIO_Mode_Out_PP;//???? ????GPIO_VALUE.GPIO_PinGPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_…

jacob 報錯 Can't co-create object

問題:開始時一切正常,后來什么都沒該,出現Cant co-create object報錯,即是創建不了ActiveXComponent wdnew ActiveXComponent("Word.Application"); 偶爾發現任務管理器中word進程居然達到10個,而我沒有打開…

map分組后取前10個_map根據屬性排序、取出map前n個

/*** map根據value排序* flag 1 正序* flag 0 倒序** param map* param flag* return*/public static > LinkedHashMap sortByValue(Map map, int flag) {LinkedHashMap sortMap new LinkedHashMap<>();if (flag 1) {map.entrySet().stream().sorted(Comparator.c…

wxpython可視化_使用wxPython的繪圖模塊wxPyPlot進行數據可視化

[Python進階(四十)-數據可視化の使用matplotlib進行繪圖前言??matplotlib是基于Python語言的開源項目&#xff0c;旨在為Python提供一個數據繪圖包。我將在這篇文章中介紹matplotlib A #-*- coding: utf-8 -*- ############################################################…

在Java EE 6中將Bean驗證與JAX-RS集成

JavaBeans驗證&#xff08;Bean驗證&#xff09;是一種新的驗證模型&#xff0c;可作為Java EE 6平臺的一部分使用。 約束條件支持Bean驗證模型&#xff0c;該約束以注釋的形式出現在JavaBeans組件&#xff08;例如托管Bean&#xff09;的字段&#xff0c;方法或類上。 javax.…

如何讓浮動的元素換行??css

當你想要做成這種布局效果的時候 紫色框里面的內容那樣 它是一個列表 li元素是塊級元素 默認大小是父元素ul的寬 并且換行 如果li沒有背景的話那就不用管了 可是問題來了它不但有背景 而且是根據文字自適應的寬高 這就是inline-block類型的功能了 那么想讓li是inline-bl…

Python學習之類和實例

面向對象最重要的概念就是類&#xff08;Class&#xff09;和實例&#xff08;Instance&#xff09;&#xff0c;必須牢記類是抽象的模板&#xff0c;比如Student類&#xff0c;而實例是根據類創建出來的一個個具體的“對象”&#xff0c;每個對象都擁有相同的方法&#xff0c;…

解決sublime里面的vue高亮的問題

下載插件文件&#xff1a;https://github.com/vuejs/vue-syntax-highlight 直接在官網下載放在安裝時候的packages目錄下&#xff08;sublime text3\Sublime Text3\Data\Packages&#xff09; 在Packages文件夾下新建一個vue的文件&#xff0c;把第一步下載的文件復制進去 subl…

python矩形填充顏色_在Python中找到所有用0填充的矩形

假設我們有一個二進制2D矩陣&#xff0c;現在我們必須找到所有用0填充的矩形的起點和終點。我們必須牢記&#xff0c;矩形是分開的&#xff0c;彼此之間不接觸&#xff0c;但是它們可以接觸陣列邊界。僅包含單個元素的矩形也是可能的。所以&#xff0c;如果輸入像-101110111011…

python concat_python中merge、concat用法

轉載&#xff1a;https://blog.csdn.net/ly_ysys629/article/details/73849543 參考&#xff1a;https://blog.csdn.net/stevenkwong/article/details/52540605 數據規整化&#xff1a;合并、清理、過濾 pandas和python標準庫提供了一整套高級、靈活的、高效的核心函數和算法將…

Vue使用axios無法讀取data的解決辦法

今天發現Vue中使用了axios后&#xff0c;then方法中無法讀取到data中的數據了&#xff0c;總是提示 Cannot set property xxx of undefined 上網找了一圈后發現了一下解決方法。 解決辦法1&#xff1a; methods:{tap:function(){var selfthis;axios.get(xxxxxx).then(function(…

設置博客園標題樣式

1.向博客園申請js權限 我們需要進入博客園自定義博客模板的頁面&#xff0c;向博客園管理團隊申請頁面運行js的權限。【博客園】->【設置】->【博客設置】&#xff0c;點擊頁面上的js權限申請&#xff0c;然后填寫申請的理由&#xff0c;耐心等幾分鐘&#xff0c;再刷新一…

Spring 3.1 –從數據庫加載XML配置的屬性

Spring使通過其PropertyPlaceholderConfigurer和&#xff08;Spring 3.1之前&#xff09;PropertySourcesPlaceholderConfigurer&#xff08;Spring 3.1&#xff09;從屬性文件中獲取的值易于注入。 這些類實現了BeanFactoryPostProcessor接口&#xff0c;該接口使它們能夠在初…

如何判斷PHP 是線程安全還是非線程安全的

什么是線程安全與非線程安全&#xff1f; 線程安全就是在多線程環境下也不會出現數據不一致&#xff0c;而非線程安全就有可能出現數據不一致的情況。 線程安全由于要確保數據的一致性&#xff0c;所以對資源的讀寫進行了控制&#xff0c;換句話說增加了系統開銷。所以在單線程…

關聯查詢mysql_《MySQL數據庫》關聯查詢

原標題&#xff1a;《MySQL數據庫》關聯查詢一、關聯查詢1、概念在查詢數據時&#xff0c;所需要的數據不只在一張表中&#xff0c;可能在兩張或多張表中。這個時候&#xff0c;需要同時操作這些表來查詢數據&#xff0c;即關聯查詢。關聯查詢所涉及到的表與表之間都會存在有關…