字典
字典的索引是key,key一般是字符串或数字
names = {123:'geed','park':'nice','900':'pool'}
names[123]
names['park']
访问不存在的key会导致错误,在访问前可以先判断成员资格,使用if语句
if name in birthdays:
keys() / values() / items()
字典的dict_keys、dict_values 和dict_items数据类型可用于for循环。获取数据类型type()。
for v in spam.values()
for k in spam.keys()
for i in spam.items(),for key , value in spam.items()
list(spam.keys())
get()方法
该方法仅仅用于dict()。类似于向dict中取一个key的vaule,如果key不存在就返回默认值,不会改变原始dict。
>>> picnicItems = {'apples': 5, 'cups': 2}
>>>picnicItems.get('cups', 0)
2
setdefault()方法
为Dict的key设置一个默认值,如果Dict中不存在该Key,就在Dict中添加该Key及其默认value同时返回该key的value,如果该Key存在就返回key对应的values值。
key存在就不改变dict,如果key不存在dict就会添加新的键值对。
统计字符串的字母出现的次数:
def count_char(message):
count = {}
for char in message:
count.setdefault(char,0)
count[char] = count[char] + 1
print(count)
return(count)
测试函数
import unittest
from open import count_char
class OpenTest(unittest.TestCase):
def test_count(self):
message = 'It was a bright cold day in April, and the clocks were striking thirteen.'
fun_return = count_char(message)
result = {' ': 13, ',': 1, '.': 1, 'A': 1, 'I': 1, 'a': 4, 'c': 3, 'b': 1, 'e': 5, 'd': 3, 'g': 2, 'i':
6, 'h': 3, 'k': 2, 'l': 3, 'o': 2, 'n': 4, 'p': 1, 's': 3, 'r': 5, 't': 6, 'w': 2, 'y': 1}
self.assertEqual(fun_return,result)
unittest.main()
从运行的结果看,dict的排序每次都有差异,即便排序不一样,也不会影响 self.assertEqual(fun_return,result)的结果
5.3.2 嵌套的字典和列表
例子的思路
allGuests = {'Alice': {'apples': 5, 'pretzels': 12},
'Bob': {'ham sandwiches': 3, 'apples': 2},
'Carol': {'cups': 3, 'apple pies': 1}}
循环两次字典将水果的名字提取出来,再通过setdefault()将水果的名字和数量添加到新的列表
import pprint
def total_brought(guest):
furists = {}
for brougt in guest.values():
for furist , numbers in brougt.items():
furists.setdefault(furist,0)
furists[furist] = furists[furist] + numbers
pprint.pprint(furists)
5.6.2 列表到字典
用 if - else 去实现感觉逻辑很清晰,但是代码更多。
用setdefault逻辑上要适应一下才行
def add_to_inventory(intentory,added_items):
for added_item in added_items:
# if added_item in intentory.keys():
# intentory[added_item] += 1
# else :
# intentory[added_item] = 1
intentory.setdefault(added_item,0)
intentory[added_item] = intentory[added_item] + 1
return intentory
用循环对比了一下两种方式实现的时间
使用if-else耗时37.539s
setdefault耗时38.618s
if-else执行时间更短。
time1 = datetime.datetime.now()
print(time1)
n = 10**6
while n>0:
stuff = {'rope': 1, 'torch': 6, 'gold coin': 42, 'dagger': 1, 'arrow': 12}
dragonLoot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby']
new = add_to_inventory(stuff,dragonLoot)
n = n -1
# print(new)
time2 = datetime.datetime.now()
print(time2)
print(time2-time1)
获取系统时间(us)
系统时间,us级别
import datetime
datetime.datetime.now()
print(time2-time1)