zoukankan      html  css  js  c++  java
  • 20 【python】入门指南:常用数据结构

    Python内置了三种高级数据结构:list,tuple,dict

    list:数组,相同类型的元素组成的数组

    tuple:元组,相同类型的元素组成的数组,但是这里有限定条件(长度是固定的,并且值也是固定的,不能被改变)

    dict:字典,k-v结构的

    list数组

    1,初始化和遍历list

    #!/bin/python
    
    a = [1, 2, 3]
    print(a, type(a))
    
    for i in a:
        print(a)

    输出:

    [1, 2, 3] <class 'list'>
    [1, 2, 3]

    2,list添加和删除元素

    a = [1, 2, 3]
    a.append(4)
    print(a) # 1,2,3,4
    a.insert(1, 11)
    print(a) #1,11,2,3,4

    解释:append是在末尾添加元素,insert(n, data)在下标n的位置添加data,原先下标n的元素依次往后移动1位

    a = [1, 2, 3, 4]
    a.pop()
    print(a) # 1,2,3
    
    a = [1, 2, 3, 4]
    a.pop(1)
    print(a) # 1,3,4

    pop()默认将最后一个数值pop出来,pop(n)是将下标为n的位置元素pop出来(这里如果n大于最大下标,python会抛出异常out of range)

    整个将list清空掉

    a = [1, 2, 3]
    del a
    print(a)

    这里会报错:a is not defined,表名del a这个操作不是仅仅清空a的元素,而且把a本身从程序中删除掉

    3,查找元素(根据key和value来查找)

    判断a是否包含某个key值,要使用:key <= len(a) - 1

    a = [1, 2, 3, 4]
    if 3 <= len(a) - 1:
        print('a[3] exist')
    
    if 4 <= len(a) - 1:
        print('a[4] exist')
    else:
        print("a[4] does not exist")

    输出:

    a[3] exist
    a[4] does not exist

    元素查找:a.count(value)

    a = [1, 2, 3, 4]
    print(a.count(1)) #1
    print(a.count(5)) #0

    count返回a中包含元素value的次数

    元素查找:a.index(value)

    a = [1, 2, 3, 4]
    print(a.index(1)) #0
    print(a.index(0))

    index是返回value在a中所在的下标,如果value没在a中出现,则python抛出异常:{value} is not in list

    4,更新某个key值

    a = [1, 2, 3, 4]
    
    if 3 <= len(a) - 1:
        a[3] = 100
    else:
        print("a[3] does not exist")
    
    print(a, len(a)) #1,2,3,100

    更新某个key的value需要根据下标来更新,但是必须确定该key是未越界的,即不能大于len(a) - 1

    5,切片

    a = [1, 2, 3, 4, 5]
    
    print(a[:]) #[1, 2, 3, 4, 5]
    
    print(a[1:2]) #[2]
    print(a[1:-1]) #[2,3,4]
    print(a[1:0]) #[]
    print(a[1:]) #[2,3,4,5]
    
    print(a[:2]) #[1,2]
    print(a[:-1]) #[1,2,3,4]
    print(a[:0]) #[]
    
    print(a[-3:]) #[3,4,5]
    print(a[-3:-1]) #[3,4]
    print(a[-3:0]) #[]

    理解:a[n:m],从下标为n的元素开始从左往右数,数到下标为m-1的元素停止

    理解n或者m为负值,则他实际计算时遵循的公式是:len(a) + n或者len(a) + m

    比如a=[1,2,3,4,5], a[-1:]此处n为-1,实际开始下标为:len(a) + n = 5 + n = 5 - 1 = 4

    6,其它相关函数

    辅助函数1:enumerate

    a = [1, 2, 3, 4, 5]
    
    for i, v in enumerate(a):
        print(i, v)

    辅助函数2:count(计算list中包含某个元素的次数)

    辅助函数:排序相关,sort,reverse

    关于list的更详尽的内容参考:http://www.runoob.com/python/python-lists.html

    ===================tuple================

    元组:元组的初始定义就决定了它的长度,也决定了它的值。无法修改所有元素,也无法改变它的长度。

    import os
    
    a = (1, 2, 3)
    
    print(len(a))
    print(a[2])
    #print(a[4]) #out of range
    #a[0] = 3 #'tuple' object does not support item assignment
    #a.append(5) #no attribute
    
    os._exit(0)

    输出结果:

    3
    3

     ====================dict==================

    操作1:初始化和遍历dict

    1.1,初始化,并查看变量的类型

    a = {"a":"1", 'b':"2", "c":"3"}
    
    print(a, type(a))

    输出:

    {'a': '1', 'c': '3', 'b': '2'} <class 'dict'>

    1.2,遍历dict元素

    a = {"a":"1", 'b':"2", "c":"3"}
    
    for k, v in a.items():
        print(k, v)

    输出:

    a 1
    b 2
    c 3

    1.3,获取某个key的值

    get(key):获取dict中key对应的元素值

    a = {"a":"1", 'b':"2", "c":"3"}
    
    print(a.get("a"))
    print(a.get('d'))

    输出:

    1
    None

    注意,以上操作中get('d')是没有抛出异常的,意味着使用get总是安全的,只是需要检查返回值是否为None。

    a = {"a":"1", 'b':"2", "c":"3"}
    print(a.get('d') == None) #True

    操作2:新增/更新元素

    a = {"a":"1", 'b':"2", "c":"3"}
    
    #update
    a["a"] = "a"
    print(a)
    
    #insert
    a['d'] = '4'
    print(a)

    输出:

    {'b': '2', 'c': '3', 'a': 'a'}
    {'b': '2', 'c': '3', 'd': '4', 'a': 'a'}

    更新dict(a)的a对应的值:a['a'] = 'a'

    新增,直接使用赋值语句即可

    3,删除某个元素

    3.1,删除某个key

    a = {"a":"1", 'b':"2", "c":"3"}
    
    del a['a']
    print(a)

    a.pop('a') #效果和del相同

    输出结果:

    {'c': '3', 'b': '2'}

    3.2,rest整个dict为空dict{},但不回收空间

    a = {"a":"1", 'b':"2", "c":"3"}
    
    a.clear()
    print(a) #{}

    clear函数用来reset某个dict为{}

    3.3,删除整个dict,并回收空间

    a = {"a":"1", 'b':"2", "c":"3"}
    
    del a
    print(a) #a is not defined

    del和之前的list数组,操作结果一样的

    4,检查某个key是否存在

    a = {"a":"1", 'b':"2", "c":"3"}
    
    print('a' in a) #True
    print('d' in a) #False
    print('d' not in a) #True

    判断某个key是否存在,使用in语句:key in dict

    判断某个key不存在,使用not in语句:key not in dict

    5,主题:深拷贝和浅拷贝

    浅拷贝

    a = {"a":"1", 'b':"2", "c":"3"}
    
    b = a
    print(b)
    
    a["a"] = "abc"
    print(b)

    输出:

    {'c': '3', 'a': '1', 'b': '2'}
    {'c': '3', 'a': 'abc', 'b': '2'}

    可以看到,a的元素值改变时,b也跟随改变了。这说明,a和b其实是同一个dict,只是名称不同而已。

    我们来看赋值语句:b=a,这个赋值代表浅拷贝,实际完成的效果是引用。

    对应的是深拷贝,用dict中自带的copy函数来完成。

    a = {"a":"1", 'b':"2", "c":"3"}
    
    b = a.copy()
    print(b)
    
    a["a"] = "abc"
    print(b)

    输出:

    {'b': '2', 'a': '1', 'c': '3'}
    {'b': '2', 'a': '1', 'c': '3'}

    可以看到a的改变并为在b的print体现。

     6,其它辅助函数

    6.1,update

    a = {"a":"1", 'b':"2", "c":"3"}
    
    b = {"a": "b1", "d":"4",}
    
    a.update(b)
    print(a)

    输出:

    {'b': '2', 'a': 'b1', 'd': '4', 'c': '3'}

    如果不管a中是否有b中key,都将b的key来替代a中key;对于a中存在,b中不存在的,则保留。

    6.2,获取所有的key列表,及其value的列表

    a = {"a":"1", 'b':"2", "c":"3"}
    
    print(a.keys())
    print(a.values())

    注意这里返回的类型分别是dict_keys,dict_values类型,而不是简单的list。同时也可以看到,顺序和初始化a的顺序是不同的,但是这两个函数的返回值的顺序,和他们在a中出现的顺序是对应的。

    dict_keys(['c', 'b', 'a'])
    dict_values(['3', '2', '1'])
  • 相关阅读:
    hdu 5119 Happy Matt Friends
    hdu 5128 The E-pang Palace
    hdu 5131 Song Jiang's rank list
    hdu 5135 Little Zu Chongzhi's Triangles
    hdu 5137 How Many Maos Does the Guanxi Worth
    hdu 5122 K.Bro Sorting
    Human Gene Functions
    Palindrome(最长公共子序列)
    A Simple problem
    Alignment ( 最长上升(下降)子序列 )
  • 原文地址:https://www.cnblogs.com/helww/p/9821753.html
Copyright © 2011-2022 走看看