用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

python不能创建字典的是_用Python创建带有重复键的字典相关推荐

  1. 字典添加数据_【Python基础学习】4. 数据类型之字典及其操作

    知行校园汇 记录学习.分享干货.吐槽人生! 关注 相关说明 文章内容:Python数据类型之字典及其操作 作者博客:csdn.cxhit.com www.cxhit.com 1. 什么是字典 在Pyt ...

  2. python字典操作函数_【python】字典的操作方法和函数

    一.字典内置函数&方法 Python字典包含了以下内置函数: 1.cmp(dict1, dict2):比较两个字典元素. 2.len(dict):计算字典元素个数,即键的总数. 3.str(d ...

  3. python文件之间的相互调用_用Python创建功能模块——截取字符串模块

    用Python创建模块 本篇文章小编给大家分享在Python如何创建属于自己的模块,实现更多的功能! 一.模块 模块是什么?简单来说,当程序的功能很多.代码量很大时,我们可以编写一个实现一定功能的py ...

  4. python一张图学懂_【python系统学习07】一张图看懂字典并学会操作

    一张图get字典 一张图get字典的些许知识点 如果图中知识点描述过于概括,请看下列细文: 字典是什么 js的对象 说到字典,前端同学可以理解其为:对象.因为python中的字典和js中的对象长的不能 ...

  5. shell调用python脚本传递命名关键字参数_关于python:将字典作为关键字参数传递给函数...

    我想使用字典在python中调用函数. 这是一些代码: d = dict(param='test') def f(param): print(param) f(d) 这打印{'param': 'tes ...

  6. python发行版是什么意思_致 Python 初学者

    当下是一个喧嚣.浮躁的时代.我们总是被生活中大量涌现的热点所吸引,几乎没有深度阅读和思考的时间和机会.我始终认为,学习是需要沉下心来慢慢钻研的,是长期的:同时,学习不应该被赋予太多的功利色彩.一个Py ...

  7. python处理视频动漫化_用Python实现抖音上的“人像动漫化”特效,原来这么简单...

    原标题:用Python实现抖音上的"人像动漫化"特效,原来这么简单 作者 | 黄伟呢 来源 | 数据分析与统计学之美 前几天,女友拉着我和她玩儿抖音,就是这个 人像动漫化的操作,顿 ...

  8. python自动化可以做什么菜_用 Python 自动化办公能做到哪些有趣或有用的事情?...

    本篇回答内容来自CSDN博主肉尼 1.CSV (1)写csv文件 import csv def writecsv(path,data): with open(path, "w") ...

  9. python init方法是不是私有方法_为什么Python的“私有”方法实际上不是私有的?...

    为什么Python的"私有"方法实际上不是私有的? Python使我们能够通过在名称前加上双下划线来创建类中的"私有"方法和变量,如下所示:__myPrivat ...

最新文章

  1. OpenAI机械手单手轻松解魔方,背靠强化学习+新技术ADR
  2. C++ 计算并输出三角形的面积
  3. Fibonacci Again
  4. 从应用到底层 36张图带你进入Redis世界
  5. Redis详解——常用命令总结(完善中)
  6. 洛谷 P1091 合唱队型
  7. 别以为程序员的工作就是写代码
  8. 信息学奥赛一本通 1145:字符串p型编码 | OpenJudge NOI 1.7 31:字符串p型编码
  9. oraclr 和mysql的不同_Mysql和Oracle中的不同
  10. opencv 图像转换(傅里叶变换)
  11. request与在php安全,request导致的安全性问题分析
  12. python程序设计第二版课后答案江红_Python核心编程第二版 第十三章课后答案
  13. vibe的matlab实现,Matlab調用VIBE算法
  14. 带拼音计算机语言翻译软件,拼音转换汉字翻译器
  15. 精神分析理论-弗洛伊德
  16. MTK6577+Android启动----pre-loader
  17. c语言运用(1)口算比赛
  18. errpt and errclear are unnormal
  19. 华为Lite OS的物联网攻略
  20. android 如何保存网页图片格式,求助,如何在安卓app内嵌的H5页面里长按保存图片?...

热门文章

  1. c语言程序设计实训教材,C语言程序设计实训指导书
  2. linux open函数_Linux驱动开发 / 字符设备驱动内幕 (1)
  3. pcie组raid linux,PCIe 4.0有多强大?组RAID 0阵列之后惊呆了
  4. java map与set的区别_java 集合(list,set,map)三者之间的关系和区别
  5. android 副mic测试,【收藏】Android Audio Framework CTS Verifier 测试方法
  6. python图像锐化_Python图像处理介绍--图像模糊与锐化
  7. Hey,孙叫兽的2020 CSDN年度报告已出炉,请查收!
  8. 撸个微信小程序的省市区选择器
  9. 纯CSS实现圆角边框
  10. HTML第一章:初始HTML