《利用Python进行数据分析》-3-数据结构、函数和文件

作者: 皮皮大 | 来源:发表于2019-07-14 12:08 被阅读1次

一、 数据结构和序列

元组tuple

创建

  • 长度固定、不可改变,但是元组中的对象可能是可变对象
  • 创建方式:直接用英文逗号隔开,带上圆括号
  • 若元组中只有一个元素,最后必须带上英文逗号
  • 元组中元素的访问,索引从0开始
tuple2 = ((1,2,3),4, [1,3,9])
tuple2
((1, 2, 3), 4, [1, 3, 9])

tuple3 = (2,)   # 单个元素带上英文逗号
tuple3
(2,)
image.png

迭代器转成元组

tuples()是一个函数,可以将任意的序列(比如字符串、列表等)转成元组形式

tuple([1,3,4])  # 将列表转成元组
(1, 3, 4)

tuple("python")  # 将字符串转成元组
('p', 'y', 't', 'h', 'o', 'n')
image.png

元组操作

tuple2[2]  # 访问元组中的元素
[1, 3, 9]

tuple2[2].append(8)  # 元组中的列表进行增添元素操作
tuple2
((1, 2, 3), 4, [1, 3, 9, 8])

("python", "java") + (0, 9) + ([1,2,3], "php")   # 多个元组相加
('python', 'java', 0, 9, [1, 2, 3], 'php')

("python", 2) * 4   # 复制串联功能
('python', 2, 'python', 2, 'python', 2, 'python', 2)

拆分元组

如果想将元组赋值给类似元组的变量,Python会拆分等号两边的值

>>tuple5 = (1, "python", [2,1,4])
>>a, b, c = tuple5
>>c
[2, 1, 4]
image.png
>>tuple6 = (6, "python", (9, 3))
>>a, b, (c, d) = tuple6    # 左边变量的个数要和元组的len相同
>>c
9

Python中的变量互换

image.png

变量拆分用来迭代元组或者列表序

seq = [(1,2,3), (4,5,6), (7,8,9)]
for a,b,c in seq:
    print("a={0} b={1} c={2}".format(a,b,c))
image.png

高级拆分功能

Python3中新增了高级的拆分功能,通过特殊语法*rest来表示,多用于抓取任意长度列表的位置参数:

  • *rest获取剩下所有的元组元素
  • rest获取到的元素是列表形式
  • rest部分是想舍弃的部分,名字不重要,许多程序员用下划线表示*_
values = 1, 3, 9, 8, 4
a, b, *rest = values   # 利用三个参数分配所有的元组对象
a, b  # 每个变量一个元组对象
(1, 3)

rest  # 剩下的全部是rest的,是列表形式
[9, 8, 4]
image.png
tuple7 = (1,2,3,5,1,3,8,3)
tuple7.count(3)     # 统计某个对象出现的次数

3
  • 按下tab键能够查看对象的方法:index()count()
    image.png

列表list

特点

  • 长度可变、内容可修改
  • []表示,或者通过list()函数直接生成
  • 通过list()函数将元组转成列表:tuple--->list
list1 = [1,3,[1,0,4], "python"]   # 列表里面的对象是任意的数据类型

list2 = list((1,2,3,4))   # 将元组转成列表通过list()函数

list3 = list(range(5))  # 将range函数生成的对象通过list()函数转成列表
image.png

list操作

在笔者第一篇札记中有详细的list知识,请参考Python札记1_list列表

  • append():末尾追加元素
  • insert(i, object):指定位置索引为i追加;消耗计算量大
  • pop(i):参数是索引,返回指定位置的元素
  • remove(object):删掉找到的第一个对象
  • extend():追加多个元素,单个添加


    image.png
image.png

attention注意:在列表中查找比字典和集合中要慢

  • 列表是线性搜索查找
  • 字典和集合在同样的时间内可以查找其他项,例如:哈希表

extend的方法比串联(使用+)的方法要快:将所有的元素追加到一个大的列表中

list1 = []
list2 = [[4,8,9],["shenzhen","suzhou"],["python","java"]]
for i in list2:
    list1.extend(i)    #extend方法,快
print(list1)
list1 = []
list2 = [[4,8,9],["shenzhen","suzhou"],["python","java"]]
for i in list2:
    list1 = list1 + i   # +串联方法,慢
print(list1)

结果:

[4, 8, 9, 'shenzhen', 'suzhou', 'python', 'java']
  • list.sort():原地排序,不生成新的列表
  • sorted(list):生成新的对象
list3 = [1,9,3,2,5]
list3.sort()
list3

list4 = sorted(list3)  # 默认从小到大,reverse=True:改成从大到小
list4

结果
[1, 2, 3, 5, 9]

根据长度key进行排序

list5 = ["python", "java", "c", "javascript", "html", "c++"]
list5.sort(key=len)  # 根据长度排序
list5

结果:

['c', 'c++', 'java', 'html', 'python', 'javascript']

二分搜索bisect

bisect模块支持二分查找,和向已知排序的列表插入值。

  • bisect.bisect可以找到插⼊值后仍保证排序的位置;参数是插入值,返回值是索引值
  • bisect.insort是向这个位置插⼊值:参数是插入值也是索引值
import bisect
list6 = [1,2,2,2,3,6,7,9]
bisect.bisect(list6,2)   # 插入元素2,按照顺序排列。如果有2,排序最后,返回的是索引值   # 结果4

bisect.bisect(list6,8)  # 插入8,返回的是索引值  #结果7

bisect.insort(list6,5)   # 索引值为5的位置插入5
list6

[1, 2, 2, 2, 3, 5, 6, 7, 9]  

列表切片

切片的基本形式为[start:stop:step]

  • 包含start,不包含stop
  • 步长左边默认是1,右边默认是-1
  • 左边索引值是从0开始,右边从-1开始
  • startstop可以省略,省略之后默认是头部和尾部
  • 如果start或者stop是负数,表示右边开始切片
  • [::-1]:表示反转列表
image.png

序列函数

https://www.cnblogs.com/sesshoumaru/p/6140987.html,这位博主对于内置函数的总结非常棒!感兴趣的去学习下。在Python有常见的序列函数:

  • sorted:默认是从小到大排序
  • enumerate:返回序列的索引值和元素
  • zip:多个序列的合并,通过list显示
  • reversed:从大到小排序,reversed是一个生成器,必须实例化之后才能进行翻转。

  • sorted:从任意序列的元素中返回一个排好序的列表,得到的是列表list
sorted([1,4,2,9,5,8])
[1, 2, 4, 5, 8, 9]
image.png image.png
  • enumerate:返回的是(i, value)元组序列
list7 = ["python", "java", "html", "Ruby"]
dict1 = { }
for k, v in enumerate(list7):
    dict1[v] = k
print(dict1)

{'python': 0, 'java': 1, 'html': 2, 'Ruby': 3}
image.png
  • zip:将多个元组、列表或者序列组合成一个新的元组sequence--->tuple。生成的长度取决于最短的序列长度。
list9 = ["python", "java", "html"]
list10 = ["shenzhen", "suzhou","zhuhai"]
zipped = zip(list9, list10)   # 得到zip对象
list(zipped)   # 通过列表进行展示

[('python', 'shenzhen'), ('java', 'suzhou'), ('html', 'zhuhai')]
image.png
zipped2 = zip(list1,tuple2,seq)   # 生成新序列的长度取决于最短的序列。seq长度为2
list(zipped2)

[(1, 9, False), (9, 8, True)]
image.png

zip和enumerate联用

list1 = ["python","java","html"]
list2 = [9,6,2]
for a, (b,c) in enumerate(zip(list1, list2)):  # 先zip合并,再enumerate同时取索引和元素
    print("{0}:{1} {2}".format(a, b, c))

结果:
0:python 9
1:java 6
2:html 2
image.png

zip进行解压
zip函数有一种类似于zip的功能,用来解压序列。

list3 = [("python", 0), ("html", 1), ("java", 2), ("javascript", 3)]
vlaues, numbers = zip(*list3)
values

结果
('python', 'html', 'java', 'javascript')
image.png
  • reversed
    reversed()从后向前迭代一个序列,从大到小
list(reversed(range(10)))   # 进行翻转

[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

字典dictionary

特点

  • 也称之为哈希映射或者关联数据表
  • 键值对是可变集合
  • 键、值都是Python对象
  • { }表示,用冒号隔开键和值

操作方法

  • 创建{}
  • 访问\增加:dict[key] = value,有则访问,无则增加
  • del dict[key] :删除键值对
  • dict.pop(key):删除键值对、返回值是value
  • dict1.update(dict2):将两个字典合并
  • keys()、values()、items():访问字典中的键、值或者键值对


    image.png
image.png image.png

多种创建方法

字典的创建是非常灵活的,方式多种多样:

  • {}大括号直接创建
dict1 = {"python": "shenzhen", "html":"shanghai", "java":"beijing","zhuhai":[1,2,6]}
dict1  # 创建字典
  • 通过序列创建
keys = ["python", "java", "html"]
values = (1,4,6)
dict3 = {}
for key, value in zip(keys, values):
    dict3[key] = value
print(dict3)
  • 字典本质上是2元元组的集合,接受2元元组的列表:
dict4 = dict(zip(list(range(5)),reversed(range(5))))
dict4

{0: 4, 1: 3, 2: 2, 3: 1, 4: 0}

相关文章

网友评论

    本文标题:《利用Python进行数据分析》-3-数据结构、函数和文件

    本文链接:https://www.haomeiwen.com/subject/lihbkctx.html