python-字典、采购项目重复元素问题

我们解决所有的问题。例如,我们要保存⼀个⼈的信息,包括姓名、年龄、体重、单位地址、家庭住址、联系号、紧急联系方式机号等信息,你会发现我们之前学过的列表、元组和集合都不是最理想的选择。

Python程序中的字典跟现实生活中的字典很像,它以键值对(键和值的组合)的方式把数据组织到一起,我们可以通过键找到与之对应的值并进⾏操作。就像《新华字典》中,每个字(键)都有与它对应的解释(值)一样,每个字和它的解释合在一起就是字典中的一个条目,而字典中通常包含了很多个这样的条目。

创建和使用字典

在Python中创建字典可以使⽤用{} 字面量语法,但是字典的{} 中的元素是以键值对的形式存在的,每个元素由 : 分隔的两个值构成, : 前面是键, : 后面是值,代码如下所示:

	person1 = ['王大锤', 55, 60, '科华北路62号', '中同仁路8号', '13122334455',
'13800998877']
person2 = ('王大锤', 55, 60, '科华北路62号', '中同仁路8号', '13122334455',
'13800998877')
person3 = {'王大锤', 55, 60, '科华北路62号', '中同仁路8号', '13122334455',
'13800998877'}

通过上面的代码,相信大家已经看出来了,用字典来保存一个人的信息远远优于使用列表或元组,因为我们可以用 : 前面的键来表示条目的含义,而 : 后面就是这个条⽬所对应的值。

当然,如果愿意,我们也可以使用内置函数 dict 或者是字典的生成式语法来创建字典,代码如下所示。

dict函数(构造器)中的每一组参数就是字典中的一组键值对
person = dict(name='王大锤', age=55, weight=60, home='中同仁路8号')
print(person) 
# {'name': '王大锤', 'age': 55, 'weight': 60, 'home': '中同仁
路8号'}

# 可以通过Python内置函数zip压缩两个序列并创建字典
items1 = dict(zip('ABCDE', '12345'))
print(items1) # {'A': '1', 'B': '2', 'C': '3', 'D': '4', 'E': '5'}
items2 = dict(zip('ABCDE', range(1, 10)))
print(items2) # {'A': 1, 'B': 2, 'C': 3, 'D': 4, 'E': 5}

# 用字典生成式语法创建字典
items3 = {x: x ** 3 for x in range(1, 6)}
print(items3) # {1: 1, 2: 8, 3: 27, 4: 64, 5: 125}

想知道字典中共有多少组键值对,仍然是使用 len 函数;如果想对字典进行遍历,可以用for 循环,但是需要注意, for 循环只是对字典的键进行了遍历,不过没关系,在讲完字典的运算后,我们可以通过字典的键获取到和这个键对应的值。

person = {'name': '王大锤', 'age': 55, 'weight': 60, 'office': '科华北路62号'}
print(len(person)) # 4

for key in person:
	print(key)

字典的运算

对于字典类型来说,成员运算和索引运算肯定是最为重要的,前者可以判定指定的键在不在字典中,后者可以通过键获取对应的值或者向字典中加入新的键值对。值得注意的是,字典的索引不同于列表的索引,列表中的元素因为有属于自己有序号,所以列表的索引是一个整数;字典中因为保存的是键
值对,所以字典的索引是键值对中的键,通过索引操作可以修改原来的值或者向字典中存入新的键值对。需要特别提醒⼤家注意的是,字典中的键必须是不可变类型,例如整数( int )、浮点数( float )、字符串( str )、元组( tuple )等类型的值;显然,列表( list )和集合( set )是不能作为字典中的键的,当然字典类型本身也不能再作为字典中的键,因为字典也是可变类型,但是字典可以作为字典中的值。关于可变类型不能作为字典中的键的原因,我们在后面的课程中再为大家详细说明。这里,我们先看看下面的代码,了解一下字典的成员运算和索引运算。

person = {'name': '王⼤锤', 'age': 55, 'weight': 60, 'office': '科华北路62号'}

#检查name和tel两个键在不在person字典中
print('name' in person, 'tel' in person) # True False

#通过age修将person字典中对应的值修改为25
if 'age' in person:
 	person['age'] = 25
 	
#通过索引操作向person字典中存⼊新的键值对
person['tel'] = '13122334455'
person['signature'] = '你的男朋友是⼀个盖世垃圾,他会踏着五彩祥云去赢取你的闺蜜'
print('name' in person, 'tel' in person) # True True

#检查person字典中键值对的数量
print(len(person)) # 6

#对字典的键进⾏循环并通索引运算获取键对应的值
for key in person:
	 print(f'{key}: {person[key]}')

字典的方法

字典类型的方法基本上都跟字典的键值对操作相关,可以通过下面的例子了解这些方法的使用.例如,我们要用一个字典来保存学生的信息,我们可以使用学生的学号作为字典中的键,通过学号做索引运算就可以得到对应的学生;我们可以把字典中键对应的值也做成一个字典,这样就可以用多组键
值对分别存储学生的姓名、性别、年龄、籍贯等信息,代码如下所示。

#字典中的值又是一个字典(嵌套的字典)
students = {
 	1001: {'name': '狄仁杰', 'sex': True, 'age': 22, 'place': '山西大同'},
 	1002: {'name': '白元芳', 'sex': True, 'age': 23, 'place': '河北保定'},
	1003: {'name': '武则天', 'sex': False, 'age': 20, 'place': '四川⼴元'}
}
#使用get方法通过键获取对应的值,如果取不到不会引发KeyError异常而是返回none
或者设定的默认值

print(students.get(1002)) # {'name': '白元芳', 'sex': True, 'age': 23,'place': '河北保定'}
print(students.get(1005)) # None
print(students.get(1005, {'name': '无名氏'})) # {'name': '无名氏'}

#获取字典中所有的键
print(students.keys()) # dict_keys([1001, 1002, 1003])
#获取字典中所有的值
print(students.values()) # dict_values([{...}, {...}, {...}])
#获取字典中所有的键值对
print(students.items()) # dict_items([(1001, {...}), (1002, {....}),(1003, {...})])

#对字典中所有的键值对进行循环遍历
for key, value in students.items():
	 print(key, '--->', value)
	 
#使⽤pop⽅法通过键删除对应的键值对并返回该值
stu1 = students.pop(1002)
print(stu1) # {'name': '白元芳', 'sex': True, 'age': 23, 'place':'河北保定'}
print(len(students)) # 2
# stu2 = students.pop(1005) # KeyError: 1005

stu2 = students.pop(1005, {})
print(stu2) # {}

#使用popitem方法删除字典中最后一组键值对并返回对应的二元组
#如果字典中没有元素,调用该方法将引发KeyError异常
key, value = students.popitem()
print(key, value) # 1003 {'name': '武则天', 'sex': False, 'age': 20,'place': '四川广元'}

#setdefault可以更新字典中的键对应的值或向字典中存入新的键值对
#setdefault方法的第一个参数是键,第二个参数是键对应的值
#如果这个键在字典中存在,更新这个键之后会返回原来与这个键对应的值
#如果这个键在字典中不存在,方法将返回第二个参数的值,默认为None

result = students.setdefault(1005, {'name': '方启鹤', 'sex': True})
print(result) # {'name': '方启鹤', 'sex': True}
print(students) # {1001: {...}, 1005: {...}}

# 使用update更新字典元素,相同的键会⽤新值覆盖掉旧值,不同的键会添加到字典中
others = {
1005: {'name': '乔峰', 'sex': True, 'age': 32, 'place': '北京大	兴'},
1010: {'name': '王语嫣', 'sex': False, 'age': 19},
 1008: {'name': '钟灵', 'sex': False}
}
students.update(others)
print(students) # {1001: {...}, 1005: {...}, 1010: {...}, 1008: {...}}

跟列表一样,从字典中删除元素也可以使用del 关键字,在删除元素的时候如果指定的键索引不到对应的值,一样会引发 KeyError 异常,具体的做法如下所示。

person = {'name': '王大锤', 'age': 25, 'sex': True}
del person['age']
print(person) # {'name': '王大锤', 'sex': True}

字典的应用

例1:输入一段话,统计每个英文字母出现的次数

sentence = input('请输⼊⼀段话: ')
counter = {}

for ch in sentence:
	 if 'A' <= ch <= 'Z' or 'a' <= ch <= 'z':
 		counter[ch] = counter.get(ch, 0) + 1
 		
for key, value in counter.items():
	 print(f'字⺟{key}出现了{value}次.')

例2:在一个字典中保存了股票的代码和价格,找出股价大于100元的股票并创建一个新的字典。

stocks = {
 'AAPL': 191.88,
 'GOOG': 1186.96,
 'IBM': 149.24,
 'ORCL': 48.44,
 'ACN': 166.89,
 'FB': 208.09,
 'SYMC': 21.29
}
stocks2 = {key: value for key, value in stocks.items() if value > 100}
print(stocks2)

简单的总结
Python程序中的字典跟现实生活中字典非常像,允许我们以键值对的形式保存数据,再通过键索引对应的值。这是一种非常有利于数据检索的数据类型,底层原理我们在后续的课程中再研究。再次提醒大家注意,字典中的键必须是不可变类型,字典中的值可以是任意类型。


数据源

dict1 = {
    "code": 5000,
    "message": "请求成功!",
    "counts": 18,
    "summation": {
        "count__sum": 10012377
    },
    "average": {
        "count__avg": 556243.1667
    },
    "maximum": {
        "count__max": 9999999
    },
    "minimum": {
        "count__min": 5
    },
    "content": [
        {
            "inspect_sku": "105395.01",
            "count": 5,
            "time": "2020-10-27"
        },
        {
            "inspect_sku": "365251.06",
            "count": 15,
            "time": "2020-10-27"
        },
        {
            "inspect_sku": "568549.32",
            "count": 23,
            "time": "2020-10-25"
        },
        {
            "inspect_sku": "985522.26",
            "count": 15,
            "time": "2020-10-24"
        },
        {
            "inspect_sku": "985522.26",
            "count": 15,
            "time": "2020-10-24"
        },
        {
            "inspect_sku": "985522.26",
            "count": 15,
            "time": "2020-10-24"
        },
        {
            "inspect_sku": "985522.26",
            "count": 15,
            "time": "2020-10-24"
        },
        {
            "inspect_sku": "985522.26",
            "count": 15,
            "time": "2020-10-24"
        },
        {
            "inspect_sku": "985522.26",
            "count": 15,
            "time": "2020-10-24"
        },
        {
            "inspect_sku": "985522.26",
            "count": 15,
            "time": "2020-10-24"
        },
        {
            "inspect_sku": "985522.26",
            "count": 15,
            "time": "2020-10-24"
        },
        {
            "inspect_sku": "542451.12",
            "count": 66,
            "time": "2020-10-23"
        },
        {
            "inspect_sku": "4133132.22",
            "count": 55,
            "time": "2020-10-27"
        },
        {
            "inspect_sku": "985522.26",
            "count": 3030,
            "time": "2020-10-28"
        },
        {
            "inspect_sku": "54685.32",
            "count": 8888,
            "time": "2020-10-27"
        },
        {
            "inspect_sku": "54685.32",
            "count": 88,
            "time": "2020-10-27"
        },
        {
            "inspect_sku": "54685.32",
            "count": 88,
            "time": "2020-10-27"
        },
        {
            "inspect_sku": "542625.88",
            "count": 9999999,
            "time": "2020-10-28"
        }
    ]
}


dat = {}
contents = dict1['content']

for num in range(len(contents)):
    date = contents[num]['time']
    if contents[num]['time'] not in dat:
        dat.update({contents[num]['time']: 0})
print(dat)

count = 0
for key in dat:
    for num in range(len(contents)):
        if contents[num]['time'] == key:
            count += contents[num]['count']
        dat[key] = count
    count = 0
print(dat)

输出:
{'2020-10-27': 0, '2020-10-25': 0, '2020-10-24': 0, '2020-10-23': 0, '2020-10-28': 0}
{'2020-10-27': 9139, '2020-10-25': 23, '2020-10-24': 120, '2020-10-23': 66, '2020-10-28': 10003029}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

像风一样的男人@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值