《利用Python进行数据分析》-3

一、 数据结构和序列

元组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}
  • 默认值
if key in dict:   # 一种常见的逻辑
    value = dict[key]
else:
    value = default_value

字典中的getpop方法可以取默认值并且返回,上面的if语句等效于:

value = dict.get(key, default_value)   # get默认返回是None;如果没有pop会报错。
dict1 = {}
words = ["book","car", "apple", "cat", "boy", "blue", "as", "apply"]

for word in words:  # 判断Word是否在words中
    letter = word[0]   # 取Word的首字母,根据首字母进行分类 
    if letter not in dict1:  # 如果首字母的键不在字典中
        dict1[letter] = [word]    # 首字母作为键,值是word组成的列表
    else:    # 如果letter在字典的键中
        dict1[letter].append(word)  # dict1[letter] 作为列表进行追加元素word
结果:
{'b': ['book', 'boy', 'blue'],
 'c': ['car', 'cat'],
 'a': ['apple', 'as', 'apply']}

利用setdefault解决

  • dict1.setdefault(letter, []):如果作为key的letter在字典dict1中,直接返回给定的键空列表
  • 如果不在,返回的是后面的默认值,并且将指定的键值对更新到字典中
dict1 = {}
words = ["book","car", "apple", "cat", "boy", "blue", "as", "apply"]
for word in words:
    letter = word[0]
    dict1.setdefault(letter, []).append(word)  
>>dict1

结果:
{'b': ['book', 'boy', 'blue'],
 'c': ['car', 'cat'],
 'a': ['apple', 'as', 'apply']}
dict1 = {'name': 'Peter', 'google': 'Google 搜索'}

print(dict1.setdefault('name', None))   
print(dict1.setdefault('city', "shenzhen")
image.png
words = ["apple", "book", "autumn", "bag", "cook", "car", "dog", "as"]
dict2 = {}

for word in words:
    letter = word[0]
    dict2.setdefault(letter, []).append(word)   # 首字母不在,则更新字典中的键值对

>>dict2 

{'a': ['apple', 'autumn', 'as'],
 'b': ['book', 'bag'],
 'c': ['cook', 'car'],
 'd': ['dog']}
image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353