Python基础知识7(字典)

(1)字典的定义和特性(dict特性称之为map---映射)

注意:list、tuple、String 序列都有个共同点:index即下标
dict1 = {}
dict2 = {'name':'chengzi', 'age': 18}

key, value(键值对) 的概念:只要知道键就可以快速索引到对应的值
上面的key为'name'/'age' value为'chengzi'/18


#字典是mutable的----可变的
#字典没有下标的概念
#可以存储任意数量的元素
#可以存储任何Python数据类型(value可以是任何类型,key可以是hash的类型,最常用的小了也是最高的 是数字或者字符串)
#以key:value,即“键:值”对的形式存储数据,每个键是唯一的
#根据键查找值的效率非常高


注意:如果输入重复的键值对,会将前面的清除,存入后面输入的键值对。

(2)字典的常用操作

#通过键查找值

>>>dict2['name']
'chengzi'

>>>dict2['age']
18

#通过键改变值的内容

>>> dict1 = {'name':'chengzi','height':170,'age':20}
>>> dict1['age'] = 25
>>> dict1
{'name': 'chengzi', 'height': 170, 'age': 25}

扫描二维码关注公众号,回复: 1786052 查看本文章

#通过key放入键值对

>>> dict1['weight'] = 55
>>> dict1
{'name': 'chengzi', 'height': 170, 'age': 25, 'weight': 55}

注意:访问不存在的key会导致程序异常,也可通过另一方式.get进行查找

>>>dict2.get('name') #现在为小括号
'chengzi'


#查找内容中的age

students = {
  'Mike Green':{
    'age':25,
    'height':170,
    'weight':59,
    'nickname':'onmy'
  },
  'Douge Jose': {
    'age':25,
    'height':160,
    'weight':55,
    'nickname':'doggy'
  }
}
print(students['Mike Green']['age'])

#检查key 是否存在

>>> dict1 = {'name':'chengzi','height':170,'age':20}
>>> 'today' in dict1
False
>>> 'name' in dict1
True

#删除元素(和List类似)
#方法一

>>> dict1 = {'name':'chengzi','height':170,'age':20}
>>> del dict1['name']
>>> dict1
{'height': 170, 'age': 20}

#方法二

>>> dict1 = {'name':'chengzi','height':170,'age':20}
>>> value = dict1.pop('age')
>>> dict1
{'name': 'chengzi', 'height': 170}

注意:pop方法同时将name对应的值对象,返回给value变量

#用id查内存地址
>>> dict1
{'name': 'chengzi', 'height': 170}
>>> id(dict1)
38816000

#清空字典内容方法一
>>> dict1.clear()
>>> dict1
{}
>>> id(dict1)
38816000

注意:这种方法清空后地址不变

#清空字典内容方法二
>>>dict1 = {}

注意:这种方法清空后地址改变

#得到所有的key返回再列List中
>>>dict1.keys()

#得到所有的value返回在类List中
>>>dict1.values()

#得到所有的(key,value)返回在类List中逐条列出
>>>dict1.items()

#在后面增加另一个dict内容
>>> dict1 = {'name':'chengzi','height':170,'age':20}
>>> dict1.update({1:'1'})
>>> dict1
{'name': 'chengzi', 'height': 170, 'age': 20, 1: '1'}


注意:
#如果赋值操作里面指定的key不存在,是添加对象
#如果key已经存在,则变成修改操作


(3)字典的遍历
#遍历 for one in alist
#需求:列出列表中所有学生的年龄

students = {
  'Mike Green':{
    'age':25,
    'height':170,
    'weight':59,
    'nickname':'onmy'
  },
  'Douge Jose': {
    'age':20,
    'height':160,
    'weight':55,
    'nickname':'doggy'
  }
}
方法一:
for name,info in students.items():#name对应名字,info对应里面的信息
  print(f'name:{name:<20},age:{info["age"]}')

方法二:
for name in students: #name遍历出来所有的key(Mike Green , Douge Jose)
  #print(students[name])打印出这两个学生对应的所有信息
  #print(students[name]['age'])只打印出年龄
  print(f'name:{name:<20},age:{students[name]["age"]}')

#Python字典中items()方法可以列出所有的键值--以及对应的值
for name in students.items():
  print(name)

#打印结果如下
('Mike Green', {'age': 25, 'height': 170, 'weight': 59, 'nickname': 'onmy'})
('Douge Jose', {'age': 20, 'height': 160, 'weight': 55, 'nickname': 'doggy'})


#获取字典长度也可以使用len()
>>>len(students)
2

>>>len(students['Mike Green'])
4

总结
#不同的数据类型,各有各的用途
#一些简单的数据,无需字典,列表就可以了
#字典是无序的,如果需要按顺序,则不可使用字典
#重点记住:所有不可改变的值都叫has值,所以列表、字典都不可以做键值

练习:

现有一个数据库记录文件(见附件0005_1.txt),保存了学生课程签到的数据库记录。 内容格式如下 ,

('2017-03-13 11:50:09', 271, 131),
('2017-03-14 10:52:19', 273, 131),
('2017-03-13 11:50:19', 271, 126),
每一行记录保存了学生的一次签到信息。

每一次签到信息的记录,分为三个部分, 分别是签到时间、签到课程的id号、签到学生的id号

要求大家实现下面的函数。其中参数fileName 为 数据库记录文件路径, 输出结果是将数据库记录文件中的学生签到信息保存在一个字典对象中,并作为返回值返回。

def putInfoToDict(fileName):

要求返回的字典对象的格式是这样的:

key 是各个学生的id号, value是 该学生的签到信息

其中value,里面保存着该学生所有签到的信息

其中每个签到的信息是字典对象,有两个元素: key 是lessonid的 记录课程id,key是checkintime的 记录签到时间

比如,对于上面的示例中的3条记录,相应的返回结果如下:

{
  131: [
    {'lessonid': 271,'checkintime':'2017-03-13 11:50:09'},
    {'lessonid': 273,'checkintime':'2017-03-14 10:52:19'},
],


  126: [
    {'lessonid': 271,'checkintime':'2017-03-13 11:50:19'},
  ],

}
---------------------------------------------------------附件0005_1.txt内容
('2017-03-13 11:50:09', 271, 131),
('2017-03-13 11:50:19', 271, 126),
('2017-03-13 11:50:25', 271, 85),
('2017-03-13 11:50:31', 271, 118),
('2017-03-13 11:50:34', 271, 119),
('2017-03-13 11:51:39', 271, 122),
('2017-03-13 11:51:41', 271, 82),
('2017-03-13 11:51:41', 271, 51),
('2017-03-13 11:51:41', 271, 53),
('2017-03-13 11:51:43', 271, 98),
('2017-03-13 11:51:44', 271, 128),
('2017-03-13 11:51:48', 271, 38),
('2017-03-13 11:51:48', 271, 67),
('2017-03-13 11:51:58', 271, 110),
('2017-03-13 11:52:01', 271, 40),
('2017-03-13 11:52:07', 271, 35),
('2017-03-13 11:52:13', 271, 108),
('2017-03-13 11:52:14', 271, 77),
('2017-03-13 11:52:18', 271, 115),
('2017-03-13 11:52:21', 271, 68),
('2017-03-13 11:52:22', 271, 129),
('2017-03-13 11:52:27', 271, 127),
('2017-03-13 11:52:30', 271, 81),
('2017-03-13 11:52:44', 271, 37),
('2017-03-13 11:52:46', 271, 43),
('2017-03-13 11:53:10', 271, 133),
('2017-03-13 11:53:39', 271, 56),
('2017-03-13 11:54:17', 271, 78),
('2017-03-13 11:58:29', 271, 74),
('2017-03-13 11:58:30', 271, 76),
('2017-03-13 11:58:53', 271, 91),
('2017-03-13 11:59:01', 271, 66),
('2017-03-13 11:59:14', 271, 83),
('2017-03-13 11:59:18', 271, 46),
('2017-03-13 11:59:40', 271, 135),
('2017-03-13 12:07:28', 271, 95),
('2017-03-14 00:50:07', 272, 38),
('2017-03-14 00:50:13', 272, 115),
('2017-03-14 00:50:34', 272, 85),
('2017-03-14 00:54:01', 272, 64),
('2017-03-14 00:54:22', 272, 104),
('2017-03-14 00:54:50', 272, 98),
('2017-03-14 00:54:55', 272, 125),
('2017-03-14 00:55:18', 272, 121),
('2017-03-14 00:55:49', 272, 45),
('2017-03-14 00:59:01', 272, 113),
('2017-03-14 01:02:38', 272, 95),
('2017-03-14 01:04:26', 272, 130),
('2017-03-14 01:04:52', 272, 83),
('2017-03-14 01:05:49', 272, 107),
('2017-03-14 01:07:16', 272, 61),
('2017-03-14 11:50:13', 273, 67),
('2017-03-14 11:50:15', 273, 141),
('2017-03-14 11:50:25', 273, 121),
('2017-03-14 11:50:31', 273, 120),
('2017-03-14 11:50:46', 273, 108),
('2017-03-14 11:50:49', 273, 126),
('2017-03-14 11:50:59', 273, 35),
('2017-03-14 11:51:00', 273, 43),
('2017-03-14 11:51:07', 273, 85),
('2017-03-14 11:51:10', 273, 103),
('2017-03-14 11:51:11', 273, 106),
('2017-03-14 11:51:17', 273, 105),
('2017-03-14 11:51:18', 273, 81),
('2017-03-14 11:52:20', 273, 110),
('2017-03-14 11:52:24', 273, 56),
('2017-03-14 11:52:45', 273, 75),
('2017-03-14 11:52:50', 273, 64),
('2017-03-14 11:52:52', 273, 133),
('2017-03-14 11:52:56', 273, 116),
('2017-03-14 11:53:02', 273, 95),
('2017-03-14 11:53:04', 273, 125),
('2017-03-14 11:53:24', 273, 102),
('2017-03-14 11:53:24', 273, 74),
('2017-03-14 11:53:31', 273, 129),
('2017-03-14 11:53:33', 273, 138),
('2017-03-14 12:02:44', 273, 96),
('2017-03-14 12:03:42', 273, 54),
('2017-03-14 12:06:04', 273, 40),
('2017-03-14 12:06:28', 273, 39),
('2017-03-16 00:50:04', 274, 116),
('2017-03-16 00:50:06', 274, 38),
('2017-03-16 00:50:13', 274, 68),
('2017-03-16 00:50:15', 274, 79),
('2017-03-16 00:50:17', 274, 115),
('2017-03-16 00:50:25', 274, 98),
('2017-03-16 00:50:37', 274, 77),
('2017-03-16 00:50:40', 274, 57),
('2017-03-16 00:50:49', 274, 107),
('2017-03-16 00:51:09', 274, 67),
('2017-03-16 00:51:11', 274, 104),
('2017-03-16 00:54:19', 274, 123),
('2017-03-16 00:54:26', 274, 102),
('2017-03-16 00:54:48', 274, 103),
('2017-03-16 00:54:52', 274, 51),
('2017-03-16 00:55:41', 274, 131),
('2017-03-16 00:56:13', 274, 121),
('2017-03-16 00:56:55', 274, 70),


-----------------------------------------------------------答案如下显示

def putInfoToDict(fileName):
  retDict = {}
  fileName = r'E:\0005_1.txt'
  with open(fileName) as f:
    #清除换行符
    lines = f.read().splitlines()

    for line in lines:
      # remove '(' and ')'
      line = line.replace('(', '').replace(')', '').replace(';', '').strip()
      #"'2017-03-13 11:50:09', 271, 131"
      parts = line.split(',')
      # ["'2017-03-13 11:50:09'", '271', '131']
      ciTime = parts[0].strip().replace("'", '')
      lessonid = int(parts[1].strip())
      #将课程id转换成字符串
      userid = int(parts[2].strip())
      #将学生id转换成字符串
      toAdd = {'lessonid': lessonid, 'checkintime': ciTime}
      # if not in, need to create list first
      if userid not in retDict:
        #通过键值对的方式,放入到字典中
        retDict[userid] = []
    retDict[userid].append(toAdd)

    # or just
    # retDict.setdefault(userid,[]).append(toAdd)
  return retDict
#调用函数并赋值给ret
ret = putInfoToDict('0005_1.txt')

#导入pprint模块打印ret,可以使打印出的字典格式更加优化、清晰
import pprint
pprint.pprint(ret)

猜你喜欢

转载自www.cnblogs.com/Automated-testing/p/9244265.html