列表和字典有什么区别?

作者:Gakki

列表和字典有什么区别?

  • 列表

    1. 可以包含不同种类、任意类型的对象,甚至可以嵌套列表。专业点就叫:异构性。
      如:下面初始化三个列表,L2列表它同时包含了好几种不同的数据类型,甚至还嵌套了列表:
    L1 = [1, 2, 3, 4, 5]
    L2 = [1, 'spam', [2.3, 4]]
    L3 = []
    
    1. 列表里的元素都是有顺序的,可以按照位置序号获取单个元素,也可以用分片的方法进行多个连续元素的获取。专业点就叫:有序性。
      如:按位置序号索引
    >>>L = ['Google', 'Runoob', 'Taobao']
    >>> L[2]
    'Taobao'
    >>> L[-2]
    'Runoob'
    

    按分片索引(截取片段左右边界与索引值的关系,口诀就是:左闭右开):

    >>> L = [1,2,3,4,5,6,7,8]
    >>>  L[1:3]
    [2, 3]
    
    1. 列表的大小和内容可以随意改变,在插入、删除、修改列表元素时,不需要建立一份新的列表拷贝,而是在原来的内存地址上直接修改列表对象。这个叫“ 本地可修改 ”。
      增加新元素的三种方法:
    # 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]
    
    1. 排序
    """
    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]
    
  • 字典

    1. 字典粒的对象是无序的,字典的每个键值 key=>value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {} 中。
      键一般是唯一的,如果重复最后的一个键值对会替换前面的,值不需要唯一。
      字典可以包含任何的数据类型,即所谓的异构性。字典里的各个元素没有什么顺序可言。

    2. 创建字典

    # 初始为空字典,动态填充新的键和值
    >>> 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}
    
    1. 读取与修改
    # 读取
    >>> 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
    
    1. 合并字典
    # 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'}  ```
    
    1. 删除和排序
    # 利用 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']
    
    

了解了列表与字典之后,我们来总结一下他们的区别吧。
相同点:

  1. 都属于序列。序列的共同点:检查长度,检查包含元素以及循环
  2. 都属于可变对象。每次更改都是更改他们本身
  3. 都可以进行增删改查
  4. 都支持推导式
  • 注:所谓序列,指的是一块可存放多个值的连续内存空间,这些值按一定顺序排列,可通过每个值所在位置的编号(称为索引)访问它们。
    不同点:

    1. 定义:列表定义 " [] 或 list ";字典定义 " { } 或 dict "
    2. 排序:列表是有序的,字典是无序的
    3. 增加元素:列表是 " list.append(x) ";字典是 " dict['key'] = value "
    4. 查询元素:列表是通过索引访问 " list[n] ";字典是通过 key 访问 " dict.get('key') "
    5. 修改元素:列表是 " list[n] = m ";字典是 " dict['key'] = new_value "
    6. 删除元素:列表是 " list.pop(n) ";字典是 " dict.pop(key)
    7. 循环:列表是 " 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() "
    8. 相互转化: 列表是 ” 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 。

集合的基础操作:

  1. 添加元素:
    add() 方法用于给集合添加元素,如果添加的元素在集合中已存在,则不执行任何操作。
    update() 方法用于修改当前集合,可以添加新的元素或集合到当前集合中,如果添加的元素在集合中已存在,则该元素只会出现一次,重复的会忽略。
  2. 删除集合中指定的元素:discard()
  3. 随机移除元素:pop()
  4. 移除指定元素:remove()
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352

推荐阅读更多精彩内容