作者:Gakki
列表和字典有什么区别?
-
列表
- 可以包含不同种类、任意类型的对象,甚至可以嵌套列表。专业点就叫:异构性。
如:下面初始化三个列表,L2列表它同时包含了好几种不同的数据类型,甚至还嵌套了列表:
L1 = [1, 2, 3, 4, 5] L2 = [1, 'spam', [2.3, 4]] L3 = []
- 列表里的元素都是有顺序的,可以按照位置序号获取单个元素,也可以用分片的方法进行多个连续元素的获取。专业点就叫:有序性。
如:按位置序号索引
>>>L = ['Google', 'Runoob', 'Taobao'] >>> L[2] 'Taobao' >>> L[-2] 'Runoob'
按分片索引(截取片段左右边界与索引值的关系,口诀就是:左闭右开):
>>> L = [1,2,3,4,5,6,7,8] >>> L[1:3] [2, 3]
- 列表的大小和内容可以随意改变,在插入、删除、修改列表元素时,不需要建立一份新的列表拷贝,而是在原来的内存地址上直接修改列表对象。这个叫“ 本地可修改 ”。
增加新元素的三种方法:
# append 方法只能在尾部加入 >>> aList = [123, 'xyz', 'zara', 'abc']; >>> aList.append( 2009 ); >>> print "Updated List : ", aList; Updated List : [123, 'xyz', 'zara', 'abc', 2009] # insert 方法可在任意位置加入,如果指定的索引值大于序列的总长度,则自动加到末尾。list.insert(index, obj) >>> aList = [123, 'xyz', 'zara', 'abc'] >>> aList.insert( 3, 2009) >>> print "Final List : ", aList Final List : [123, 'xyz', 'zara', 2009, 'abc'] # extend 方法可以在尾部一次性加入多个元素 >>> aList = [123, 'xyz', 'zara', 'abc', 123]; >>> bList = [2009, 'manni']; >>> aList.extend(bList) >>> print "Extended List : ", aList ; Extended List : [123, 'xyz', 'zara', 'abc', 123, 2009, 'manni']
删除元素的几种方法:
# remove() 函数用于移除列表中某个值的第一个匹配项。它也是在原列表上就地删除,返回值为None >>> aList = [123, 'xyz', 'zara', 'abc', 'xyz']; >>> aList.remove('xyz'); >>> print "List : ", aList; >>> aList.remove('abc'); >>> print "List : ", aList; List : [123, 'zara', 'abc', 'xyz'] List : [123, 'zara', 'xyz'] # pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。 >>> list1 = ['Google', 'Runoob', 'Taobao'] >>> list_pop=list1.pop(1) >>> print "删除的项为 :", list_pop >>> print "列表现在为 : ", list1 删除的项为 : Runoob 列表现在为 : ['Google', 'Taobao'] """ 内置函数 del ,使用 del 语句可以从一个列表中依索引而不是值来删除一个元素。 这与使用 pop() 返回一个值不同。 可以用 del 语句从列表中删除一个切割,或清空整个列表(我们以前介绍的方法是给该切割赋一个空列表) """ >>> a = [-1, 1, 66.25, 333, 333, 1234.5] >>> del a[0] >>> a [1, 66.25, 333, 333, 1234.5] >>> del a[2:4] >>> a [1, 66.25, 1234.5] >>> del a[:] >>> a [] # 也可以用 del 删除实体变量: >>> del a
修改元素的方法:
# 对单个元素修改 >>> nums = [40, 36, 89, 2, 36, 100, 7] >>> nums[2] = -26 #使用正数索引 >>> nums[-3] = -66.2 #使用负数索引 >>> print(nums) [40, 36, -26, 2, -66.2, 100, 7] """ 修改一组元素 Python 支持通过切片语法给一组元素赋值。 在进行这种操作时,如果不指定步长(step 参数) Python 就不要求新赋值的元素个数与原来的元素个数相同; 这意味,该操作既可以为列表添加元素,也可以为列表删除元素。 """ >>> nums = [40, 36, 89, 2, 36, 100, 7] # 修改第 1~4 个元素的值(不包括第4个元素) >>> nums[1: 4] = [45.25, -77, -52.5] >>> print(nums) [40, 45.25, -77, -52.5, 36, 100, 7] # 如果对空切片(slice)赋值,就相当于插入一组新的元素: >>> nums = [40, 36, 89, 2, 36, 100, 7] #在4个位置插入元素 >>> nums[4: 4] = [-77, -52.5, 999] >>> print(nums) [40, 36, 89, 2, -77, -52.5, 999, 36, 100, 7]
- 排序
""" sort() 函数用于对原列表进行排序,如果指定参数,则使用比较函数指定的比较函数。 list.sort(cmp=None, key=None, reverse=False)。 reverse -- 排序规则,reverse = True 降序, reverse = False 升序(默认)。 """ >>> aList = ['123', 'Google', 'Runoob', 'Taobao', 'Facebook']; >>> aList.sort(); >>> print("List : ") >>> print(aList) List : ['123', 'Facebook', 'Google', 'Runoob', 'Taobao'] # reverse() 函数用于反向列表中元素。 >>> aList = [123, 'xyz', 'zara', 'abc', 'xyz'] >>> aList.reverse() >>> print "List : ", aList List : ['xyz', 'abc', 'zara', 'xyz', 123]
- 可以包含不同种类、任意类型的对象,甚至可以嵌套列表。专业点就叫:异构性。
-
字典
字典粒的对象是无序的,字典的每个键值 key=>value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {} 中。
键一般是唯一的,如果重复最后的一个键值对会替换前面的,值不需要唯一。
字典可以包含任何的数据类型,即所谓的异构性。字典里的各个元素没有什么顺序可言。创建字典
# 初始为空字典,动态填充新的键和值 >>> dict = { } >>> dict['name'] = 'test' >>> dict['age'] = '15' >>> print(dict) {'name': 'test', 'age': '15'} # 用列表动态生成字典 >>> key_list = ['name','age','grades'] >>> value_list = ['test','20','100'] >>> D = dict(zip(key_list, value_list)) >>> print(D) {'name': 'test', 'age': '20', 'grades': '100'} # 使用键值对元组组成的列表构造字典 >>> D = dict([('name','test'),('age','22'),('grades',60)]) >>> print(D) {'name': 'test', 'age': '22', 'grades': 60}
- 读取与修改
# 读取 >>> dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'} >>> print "dict['Name']: ", dict['Name'] >>> print "dict['Age']: ", dict['Age'] dict['Name']: Zara dict['Age']: 7 # 用这种直接访问的方式,如果建不存在就会报错,我们可以通过 in 判断方法来进行避免 >>> dict = {'name': 'test', 'age': '22', 'grades': 60} >>> print('dd' in dict) >>> if not 'dd' in dict: >>> print('不存在') False 不存在 # 还可以通过 get 方法来判断元素是否存在。 # get 中第二个参数指的是键不存在时指定返回的默认值,如果不设置这个值,则返回None。 >>> dict = {'name': 'test', 'age': '22', 'grades': 60} >>> print(dict.get('dd','不存在')) >>> print(dict.get('测试')) 不存在 None # 获取所有的键值列表 >>> dict = {'name': 'test', 'age': '22', 'grades': 60} >>> print(list(dict.keys())) >>> print(list(dict.values())) ['name', 'age', 'grades'] ['test', '22', 60] # 修改 >>> dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'} >>> dict['Age'] = 8 # 更新 >>> dict['School'] = "RUNOOB" # 添加 >>> print "dict['Age']: ", dict['Age'] >>> print "dict['School']: ", dict['School'] dict['Age']: 8 dict['School']: RUNOOB
- 合并字典
# update() 函数把字典dict2的键/值对更新到dict里。 # 如果这两个字典中有冲突的键,那么会无规律的进行覆盖 >>> dict = {'Name': 'Zara', 'Age': 7} >>> dict2 = {'Sex': 'female' } >>> dict.update(dict2) >>> print "Value : %s" % dict Value : {'Age': 7, 'Name': 'Zara', 'Sex': 'female'} ```
- 删除和排序
# 利用 del >>> dict = {'name': 'test', 'age': '22', 'grades': 60} >>> del dict['name'] >>> print(dict) {'age': '22', 'grades': 60} # 利用 pop() 方法删除字典给定键 key 及对应的值,返回值为被删除的值。key 值必须给出。 否则,返回 default 值。pop(key[,default]) >>> dict = {'name': 'test', 'age': '22', 'grades': 60} >>> print(dict.pop('name')) >>> print(dict.pop('ss','不存在的键')) >>> print(dict) test 不存在的键 {'age': '22', 'grades': 60} # popitem() 方法返回并删除字典中的最后一对键和值。 >>> site= {'name': '菜鸟教程', 'alexa': 10000, 'url': 'www.runoob.com'} >>> pop_obj=site.popitem() >>> print(pop_obj) >>> print(site) ('url', 'www.runoob.com') {'name': '菜鸟教程', 'alexa': 10000} # 排序,之前讲到,在字典里对象是无序的,如果对字典进行排序实际上是在对键进行排序,它返回一个排好序的键的列表 >>> dict = {'name': 'test', 'age': '22', 'grades': 60} >>> print(sorted(dict)) >>> print(sorted(dict.keys())) ['age', 'grades', 'name'] ['age', 'grades', 'name']
了解了列表与字典之后,我们来总结一下他们的区别吧。
相同点:
- 都属于序列。序列的共同点:检查长度,检查包含元素以及循环
- 都属于可变对象。每次更改都是更改他们本身
- 都可以进行增删改查
- 都支持推导式
-
注:所谓序列,指的是一块可存放多个值的连续内存空间,这些值按一定顺序排列,可通过每个值所在位置的编号(称为索引)访问它们。
不同点:- 定义:列表定义 " [] 或 list ";字典定义 " { } 或 dict "
- 排序:列表是有序的,字典是无序的
- 增加元素:列表是 " list.append(x) ";字典是 " dict['key'] = value "
- 查询元素:列表是通过索引访问 " list[n] ";字典是通过 key 访问 " dict.get('key') "
- 修改元素:列表是 " list[n] = m ";字典是 " dict['key'] = new_value "
- 删除元素:列表是 " list.pop(n) ";字典是 " dict.pop(key)
- 循环:列表是 " for x in [] list 、for list[x] in range(len(list))、for index,x in enumerate(list) " ;字典是 " for k in dict.keys()、for v in dict.values()、for k,v in dict.items() "
- 相互转化: 列表是 ” list({'name':'test','age':'20'}) ",字典是 " dict(['name':'test'],['age':'20'])。列表转字典是必须一对数据放在一起用括号括起来,字典转列表默认转化的是键。
杂谈
列表,元组,字典,集合的区别?
元组和列表在结构上没有什么区别,唯一的差异在于元组是只读的,不能修改。元组使用小括号 " () ",列表使用方括号 " [] "。
元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。
定义一个元组:
tup1 = ('physics', 'chemistry', 1997, 2000)
创建一个空元组:
tup1 = ()
集合(set)是一个无序的不重复元素序列。可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。
因为集合是无序的,所以集合不支持索引、分片或其他序列的操作。
创建格式:
parame = {value01,value02,...}
或者
set(value)
集合和字典类似,也是一组 key 的集合,但不存储 value 。由于 key 不能重复。所以,在集合中,没有重复的 key 。
集合的基础操作:
- 添加元素:
add() 方法用于给集合添加元素,如果添加的元素在集合中已存在,则不执行任何操作。
update() 方法用于修改当前集合,可以添加新的元素或集合到当前集合中,如果添加的元素在集合中已存在,则该元素只会出现一次,重复的会忽略。 - 删除集合中指定的元素:discard()
- 随机移除元素:pop()
- 移除指定元素:remove()