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.mzph.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;即关联查询。关联查询所涉及到的表与表之间都会存在有关…