从Excel到Python数据分析:Pandas、xlwings、openpyxl、Matplotlib的交互与应用
上QQ阅读APP看书,第一时间看更新

2.2 数据结构

数据结构就是数据与数据之间的关系。在Python中,主要有列表、元组、字典、集合这4种数据结构,可理解为4种容器。这些数据结构之间是可以进行相互转换的;各结构内的元素可以通过遍历或其他方式获取具体值。

2.2.1 列表

列表是一个有序、可变、可重复的数据集,相当于C++、Java等语言中的数组,功能十分强大。在Python中,列表有很多优点,例如通过偏移来索引、支持嵌套、可变的类型。列表常用于以下操作:切片/索引、生成新列、删除、修改并重新赋值、成员关系的判断、列表推导、可转换为其他的数据结构等。

1.列表创建

可以使用以下两种方式创建空列表,代码如下:

    #ch02d002.ipynb
    lst = []
    #lst = list()

创建列表lst1、lst2,代码如下:

    lst1 = ['上海','南京','常州','无锡','苏州']
    lst2 = ['厦门','合肥','宁波','杭州']
    lst3 = [0,1,2,3,4]
    lst4 = [[5,6,7,8]]

对列表lst1、lst2进行相加,代码如下:

    lst1+lst2

返回的值如下:

    ['上海','南京','常州','无锡','苏州','厦门','合肥','宁波','杭州']

对列表lst1、lst3进行相加,代码如下:

    lst1+lst3

在同一列表中允许存在不同的数据类型。返回的值如下:

    ['上海','南京','常州','无锡','苏州',0,1,2,3,4]

对列表lst1、lst4进行相加,代码如下:

    lst1+lst4

在同一列表中允许存在多维的列表。返回的值如下:

    ['上海','南京','常州','无锡','苏州',[5,6,7,8]]

对列表lst2重复2次,代码如下:

    lst2 * 2

返回的值如下:

    ['厦门','合肥','宁波','杭州','厦门','合肥','宁波','杭州']
2.列表函数

在Python中常用的列表函数见表2-1。

表2-1 Python中常用的列表函数

以上函数的x参数为对象,i参数为下标索引值(从0开始计算)。list.extend(seq)中的seq参数为另外一个列表。在Python的列表中,每个元素都有数字下标,代表在列表中的位置,这个位置就是索引,所以也常称为下标索引或下标索引值。

Python中列表函数append()应用举例,代码如下:

    ln = [2,8,9,3,3,3,9,2,5,3,8,3]
    ln1 = [1,2,3,4]
    ln.append(ln1)
    ln

列表ln1将作为一个列表整体追加到列表ln的尾部。返回的值如下:

    [2,8,9,3,3,3,9,2,5,3,8,3,[1,2,3,4]]

列表函数extend()应用举例,代码如下:

    ln = [2,8,9,3,3,3,9,2,5,3,8,3]
    ln1 = [1,2,3,4]
    ln.extend(ln1)
    ln

将列表ln1中的全部元素追加到列表ln的尾部。返回的值如下:

    [2,8,9,3,3,3,9,2,5,3,8,3,1,2,3,4]

列表函数insert()应用举例,代码如下:

    ln = [2,8,9,3,3,3,9,2,5,3,8,3]
    ln.insert(3,2893)
    ln

在列表ln下标值3的位置(下标值从0开始)插入2893。返回的值如下:

    [2,8,9,2893,3,3,3,9,2,5,3,8,3]

列表函数remove()应用举例,代码如下:

    ln.remove(2893)
    ln

在列表ln中移除2893。返回的值如下:

    [2,8,9,3,3,3,9,2,5,3,8,3]

列表函数pop()从列表ln中弹出最后一个值,代码如下:

    ln.pop()
    ln

在列表ln中移除最后一个值3。返回的值如下:

    [2,8,9,3,3,3,9,2,5,3,8]

从列表ln现存值中下标为3的位置弹出该值,代码如下:

    ln.pop(3)
    ln

返回的值如下:

    [2,8,9,3,3,9,2,5,3,8]

列表函数index(x)从列表ln现存值查找数值8的下标索引位置,代码如下:

    ln.index(8)

返回值为1。其他函数用法不再一一举例。

3.列表访问

对于列表可利用索引或切片进行访问。创建列表如下:

    lst = ['上海','南京','常州','无锡','苏州','厦门','合肥','宁波','杭州']

对其进行索引(Python中的下标索引值是从0开始计算的)。索引或切片时,可以为正数索引,也可以是负数索引;正数索引时,应用举例,代码如下:

    lst[3]

返回的值为“无锡”。利用切片对列表进行访问,代码如下:

    lst[3:7]

在Python中切片为左闭右开,返回的值如下:

    ['无锡','苏州','厦门','合肥']

应用举例,采用负数索引,代码如下:

    lst[-5:-2]

返回的值如下:

    ['苏州','厦门','合肥']

在实际使用过程中,会经常对列表进行遍历,相关知识在循环结构部分进行讲解。

2.2.2 元组

元组是与列表类似的数据结构。元组是一个有序、不可变、可重复的数据集,相邻元素用逗号隔开。其区别在于:列表为中括号,元组为小括号,元组内的数据不可更改。可以使用以下两种方式创建空元组,代码如下:

    tple = ()
    #tple = tuple()
    type(tple)

创建一个值的元组,代码如下:

    tpl = (2,)
    type(tpl)

返回的值为tuple。

注意:当元组中只有一个值时,值后面的逗号不能省略。

继续创建元组,代码如下:

    tp = (2,8,9,3,3,3,9,2,5,3,8,3)

元组计算应用举例(右侧备注为返回的值),代码如下:

    max(tp)                        #9
    min(tp)                        #2
    len(tp)                        #12
    tp.count(3)                    #5

与列表一样,可以对元组进行索引或切片,代码如下:

    tp[3]                          #3
    tp[3:7]                        #(3,3,3,9)

如果对元组进行数据修改,则会报错提示。应用举例:

    tp.reverse()
    tp

返回的报错提示如下:

    AttributeError:'tuple'object has no attribute  'reverse'

2.2.3 字典

字典是一个无序、可变、可重复的数据集。字典也称键-值对,它是通过键来将一系列的值串接起来的,可以通过键从字典中获取指定项。字典是通过大括号来创建的。字典中的键必须是唯一且不可变的,键可以是数字、字符串或元组,但不能是列表,每个键与值之间用冒号隔开,每一对键值之间用逗号隔开。

1.字典创建

可以使用以下两种方式创建一个空字典,代码如下:

    dic = dict()
    #dic = {}

继续创建字典,代码如下:

    dic1 = {'蛋糕纸':'纸盒','苹果醋':'酸醋'}
    dic2 = {'语文':[95,85,],'数学':[93,87,]}

dic1中的值为字符串,dic2中的值为列表。查看这两个字典的数据类型,代码如下:

    print(type(dic),type(dic1),type(dic2))

返回的值如下:

    <class 'dict'><class  'dict'><class  'dict'>

在Python中,类与对象的区别:抽象的类(class),具体的对象(object)。

字典可以任意嵌套,值由列表及元组构成,代码如下:

查看其数据类型。

    type(dct)                      #dict

查看字典的items,代码如下:

    print(dct.items())

返回的值如下:

    dct_items([('华北',[('华北','北京','DD001','蛋糕纸',2,2)]),('华东',[('华东','上海','D
    D003','苹果醋',2,2),('华东','宁波','DD004','钢化膜',1,1)])])
2.字典访问

对字典进行访问是通过键来读取的,代码如下:

    dct['华北']

返回的值如下:

    [('华北','北京','DD001','蛋糕纸',2,2)]

如果该键不存在,则会报错提示。应用举例:

    dct['华西']

返回的错误提示如下:

    KeyError             Traceback(most recent call last)
    ~\AppData\Local\Temp/ipyKernel_9252/3152721856.py in<module>
    ---->1 dct['华西']
     
    KeyError:'华西'
3.字典遍历

在字典遍历过程中,常用的3种方法为keys()、values()、items()。应用举例,遍历字典中的keys(),代码如下:

    for k in dct.keys():
        print(k)

运行以上代码,返回的值如下:

    华北
    华东

应用举例,遍历字典中的values(),代码如下:

    for v in dct.values():
       print(v)

运行以上代码,返回的值如下:

    [('华北','北京','DD001','蛋糕纸',2,2)]
    [('华东','上海','DD003','苹果醋',2,2),('华东','宁波','DD004','钢化膜',1,1)]

应用举例,遍历字典中的键值items(),代码如下:

    for i in dct.items():
       print(i)

运行以上代码,返回的值如下:

    ('华北',[('华北','北京','DD001','蛋糕纸',2,2)])
    ('华东',[('华东','上海','DD003','苹果醋',2,2),('华东','宁波','DD004','钢化膜',1,1)])

应用举例,通过遍历字典以获取具体的每个key值,代码如下:

    for key,value in dct.items():
       print(key)

在以上代码中循环变量key和value采用k、v或其他命名方式是允许的。返回的值如下:

    华北
    西南
    华东

应用举例,通过遍历字典以获取具体的每个value值,代码如下:

    for key,value in dct.items():
       print(value)

返回的值如下:

    [('华北','北京','DD001','蛋糕纸',2,2)]
    [('华东','上海','DD003','苹果醋',2,2),('华东','宁波','DD004','钢化膜',1,1)]

或者直接采用keys()、values()、items(),返回列表值,代码如下:

    print(dct.keys())                   #dict_keys数据类型
    print(dct.values())                 #dict_values数据类型
    print(dct.items())                  #dict_items数据类型

2.2.4 集合

在Python中,集合是一个无序、不可重复的数据集。集合有可变集合(set)和不可变集合(frozenset)两种。

(1)集合具备去重功能,当集合中存在重复的元素时会自动保留一个。

(2)集合是无序的,集合内各元素出现的位置每次都会不同。

(3)Python中的集合与数学中的集合概念类似,可以对其进行并集、交集、差集及补集等操作。

字典是通过大括号{}来创建的,相邻元素间用逗号(,)分开。可用set()创建空白集合。Python中集合常用的方法见表2-2。

表2-2 Python中集合常用的方法

以上方法中,a和b各自代表的是一个数据的集合,x代表的是集合中的元素。

集合中union()方法应用举例,代码如下:

    a = {'上海','南京','常州','无锡','苏州'}
    b = {'南京','常州','宁波','杭州'}
    c = a.union(b)                       #a|b
    c

在新的集合c中,返回的是集合a与b的并集,返回的值如下:

    {'上海','南京','宁波','常州','无锡','杭州','苏州'}

update()方法用于修改当前集合,可以将新的元素或集合添加到当前集合中(添加的过程中会自动添加重复的元素)。集合中update()方法应用举例,代码如下:

    a = {'上海','南京','常州','无锡','苏州'}
    b = {'南京','常州','宁波','杭州'}
    a.update(b)                        #a| = b
    a

在修改后的集合a中,在添加集合b中所有元素的同时并删除了在a集合中重复的元素,返回的值如下:

    {'上海','南京','宁波','常州','无锡','杭州','苏州'}

集合中intersection()方法应用举例,代码如下:

    a = {'上海','南京','常州','无锡','苏州'}
    b = {'南京','常州','宁波','杭州'}
    c = a.intersection(b)                 #c = a&b
    c

在新的集合c中,返回的是集合a与b的交集,返回的值如下:

    {'南京','常州'}

集合中intersection_update()方法应用举例,代码如下:

    a = {'上海','南京','常州','无锡','苏州'}
    b = {'南京','常州','宁波','杭州'}
    a.intersection_update(b)              #a& = b
    a

返回的值如下:

    {'南京','常州'}

集合中add()方法应用举例,代码如下:

    a = {'上海','南京','常州','无锡','苏州'}
    a.add('杭州')
    a

返回的值如下:

    {'上海','南京','常州','无锡','杭州','苏州'}

超集检查issuperset()方法应用举例,代码如下:

    a = {'上海','南京','常州','无锡','苏州'}
    b = {'南京','常州'}
    a.issuperset(b)                     #a>b

返回的值为True。