Chapter 3.1 Python的数据结构

Basic Data Structure:元组(tuple)、列表(list)、字典(dictionary)和集合(set)

1. Tuple

1.1 tuple是长度固定,不可改变的序列。

tup = 1,2,3
type(tup)
image.png

存放在tuple中的object本身无法更改。

tuple = 1,[1,2,3],'ok'
tuple[2] = 'okok'  #会报错

但是如果tuple内部的object是可更改的,(如tuple内部的一个object为list)那么我们可以试着更改一下

tuple[1].append(4)
#运行后tuple为(1,[1,2,3,4],'ok')

1.2 用+来合并多个tuple

tup = 1,2,3
tup1 = 4,5,6
tup + tup1
#result = (1,2,3,4,5,6)

1.3 * 相当于copy多份,也可以用在list上

tup = 1,2,3
tup1 = tup*2
tup + tup1
image.png

1.4 unpacking tuples(取出元组)


image.png

1.5 元组方法

1.5.1 count


image.png

2. List

2.1 列表的灵活性就很强了,大小和内容都可以变


image.png

2.2 list函数通常用来具现化迭代器或生成器


image.png

2.3 添加和移除元素

2.3.1 Append
直接在list后面添加

a_list.append('very much')
a_list

2.3.2 Insert
insert可以把元素插入到特定的位置

a_list.insert( 0,'hey' )
a_list
#result: ['hey', 'yes', 'i', 'hate', 'you', 'very much']

2.3.3 pop
insert的反向操作叫pop, 能移除序列中特定位置的元素:

a_list.pop( 0 )
a_list
#result: ['yes', 'i', 'hate', 'you', 'very much']

2.3.4 remove
remove可以通过值移除指定的element,如果同一个值在序列中多次出现,只移除第一个

a_list.remove('very much')
a_list
#result: ['yes', 'i', 'hate', 'you']

2.3.5 in/not in
检查一个值是否在list中,用in

'yes' in a_list
#result: True

2.4 合并list(extend/+)
2.4.1 用+合并list。

c_list = a_list + b_list
c_list
#result: ['yes', 'i', 'hate', 'you', 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

2.4.2 extend
通过entend方法,可以添加多个元素

a_list.extend(['but','now','i','dont'])
a_list
#result: ['yes', 'i', 'hate', 'you', 'but', 'now', 'i', 'dont']

append和extend的区别:
append是把元素添加到一个list里
extend是把两个list结合在一起

extend和+的区别:
+是创建了一个新的list并返回,运算量大
extend是在原本的list上做了更改,运算量小

2.5 排序
sort函数/设置key的sort函数

a_list.sort()
a_list
#result: ['but', 'dont', 'hate', 'i', 'i', 'now', 'yes', 'you']
a_list.sort(key=len)
a_list
#result: ['i', 'i', 'but', 'now', 'yes', 'you', 'dont', 'hate']

另外,Python中的bisect模块可以实现二分搜索和维持一个排好序的list

import bisect
c_list = [9,2,5,3,7]
c_list.sort()
c_list
bisect.bisect(c_list,10)
bisect.insort(c_list,10)
c_list
#result: [2,3,5,7,9]
#5(10在这个排好序的list中可以插入的位置)
#[2, 3, 5, 7, 9, 10]

2.6 切片
[start:stop], 输出的结果包含开头,不包含结尾。所以输出的结果的数量是stop-start

c_list[1:4]
#result: [3, 5, 7]

可以用来赋值

c_list[0:1] = [0,1,1.5]
c_list
#将元素2换成0,1,1.5
#result: [0, 1, 1.5, 3, 5, 7, 9, 10]

等等等等。

2.7 内建的序列函数
2.7.1 enumerate
enumerate通常用来把一个list中的位置和值映射到一个dcit字典里
Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身

i=0
#for value in a_list:
#    i+=1
mapping={} #mapping是一个字典
for i,value in enumerate(a_list):
    mapping[value] = i
mapping
#result: {'but': 2, 'dont': 6, 'hate': 7, 'i': 1, 'now': 3, 'yes': 4, 'you': 5}

2.7.2 sorted
sorted函数(函数≠方法!函数需要参数,方法直接通过对象调用)返回一个新的排好序的序列,而之前提到的.sort方法是直接更改原有的序列,不产生新序列

c_list = [9,2,5,3,7]
sorted(c_list)
#result: [2, 3, 5, 7, 9]

2.7.3 zip
用于"pairs"(成对)。把多个序列中每个对应的元素变成一对,最后返回一个含有tuple的list

zip1 = [1,2,3,4]
zip2 = [5,6,7]
zipped = zip(zip1,zip2)
zipped
#result: <zip at 0x19b93fb0788>
list(zipped)
#result: [(1, 5), (2, 6), (3, 7)]

zip可以接收任意长度的序列,最后返回的结果取决于最短的序列.

zip与enumerate合用:

for i,(a,b) in enumerate(zip(zip1,zip2)):
    print('{0},({1},{2})'.format(i,a,b))
#result: 
#0,(1,5)
#1,(2,6)
#2,(3,7)

还可以解压被压缩的序列。
(需要注意,序列被压缩后的类型是zip,需要用list()进行类型转换,转换为list类型后,才可以解压)
解压后返回的序列类型是元组(tuple)。

zip_list = list(zipped)
former,latter = zip(*zip_list)
former
#result: (1, 2, 3) 

2.7.4 reversed

3. 字典(dict)

3.1
key-value pairs.创建方式是用{}

a_dict = {'amy':1,'paul':2,'summer':0} #创建
a_dict['allen']=1 #插入
a_dict
#result: {'allen': 1, 'amy': 1, 'paul': 2, 'summer': 0}
del a_dict['summer']#删除
a_dict
#result: {'allen': 1, 'amy': 1, 'paul': 2}
a_dict.pop('allen')#删除
a_dict
#result: {'amy': 1, 'paul': 2}

3.2 keys和values方法能返回dict中key-value组合的迭代器,不过并不按什么顺序。

a_dict.keys()
#result: dict_keys(['amy', 'paul'])
a_dict.values()
#result: dict_values([1, 2])

注意这两个方法返回的类型分别是dict_keys和dict_values,可以用list()函数将他们转为list类型,让keys和values每次打印的顺序相同

3.3 可以用update方法来合并两个dict。

b_dict = {'elisa':4,'noodle':0}
a_dict.update(b_dict)
a_dict
#result: {'amy': 1, 'elisa': 4, 'noodle': 0, 'paul': 2}

3.4 把两个独立的序列按照key-value的方式生成一个dict
方法一:先将两个序列用zip方法pair起来,在遍历组合起来

key = ['a','b','c']
value = [1,2,3]
mapping = {}
for key,value in zip(key,value):
   mapping[key]=value
mapping
#result: {'a': 1, 'b': 2, 'c': 3}

方法二:使用dict()方法

key = ['d','e','f']
value = [1,2,3]
mapping = dict(zip(key,value))
mapping
#result: {'d': 1, 'e': 2, 'f': 3}

但这个方法也一定要先将key和value zip起来,让他们组合起来变成含有两个元素的一个整体。因为dict()里面只接受一个object。

3.5 在dict的value值中添加值

????

3.6 Valid dict key types(有效的key类型)
通常key的类型是不可更改的常量类型(int,float,string)或tuple。专业的叫法是hashability。可以查看一个object是否是hashable,只要是hashable的,就可以当做dict中的key。这里用hash函数查看

4. 集合Set

set是无序且元素不重复的。就像是key唯一,且没有value的字典。

4.1 创建
两种方式可以创建,一个是用set函数,一个是用花括号

a_set = set([1,2,3,4,5])
a_set
#result: {1, 2, 3, 4, 5}
b_set = {6,7,8,9,0}
b_set
#result: {0, 6, 7, 8, 9}

4.2 基本操作
集合的操作也支持,比如并集,交集,差集

a_set.union(b_set) #并集
#result: {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
a_set.intersection(b_set) #交集
#result: set() 空集
image.png

4.3 set的元素必须是不可更改的。如果用list类型来创建set,只能先将其变为tuple

list = [10,20,30,40,50]
c_set = {list}
c_set

报错:
TypeError Traceback (most recent call last)
<ipython-input-35-0cabeb1b8f87> in <module>()
1 list = [10,20,30,40,50]
----> 2 c_set = {list}
3 c_set

TypeError: unhashable type: 'list'

Let's rectify it.

list = [10,20,30,40,50]
c_set = {tuple(list)}
c_set

5. List, Set, and Dict Comprehensions(推导式)

list推导式:
[expr for val in collection if condiction]

dict推导式:
dict_comp = {key-expr: value-expr / for value in collection if condition}

set的推导式:
set_comp = {expr for value in collection if condition}

map

????????

例子

name_dict = ['tom','rose','jack','icy']
d_dict = {val: i for i,val in enumerate(name_dict)}
d_dict
#result: {'icy': 3, 'jack': 2, 'rose': 1, 'tom': 0}

注意: dict会自动排序(字符串的话会按照首字母),list不会(按照创建的顺序)

6.Nested list comprehensions(嵌套列表表达式)

若list里面嵌套list,要如何将里面的元素取出来呢。

方法一:用一个for loop

all_data = [['John', 'Emily', 'Michael', 'Mary', 'Steven'], 
            ['Maria', 'Juan', 'Javier', 'Natalia', 'Pilar']]
names_i_want = []
for names in all_data: #这里的names是list中的list
    contain_i = [name for name in names if name.count('i')>0] #从list中list中取出元素
    names_i_want.**append**(contain_i)
names_i_want
#result: [['Emily', 'Michael'], ['Maria', 'Javier', 'Natalia', 'Pilar']]
all_data = [['John', 'Emily', 'Michael', 'Mary', 'Steven'], 
            ['Maria', 'Juan', 'Javier', 'Natalia', 'Pilar']]
names_i_want = []
for names in all_data:
    contain_i = [name for name in names if name.count('i')>0]
    names_i_want.**extend**(contain_i)
names_i_want
#result: ['Emily', 'Michael', 'Maria', 'Javier', 'Natalia', 'Pilar']

方法二:嵌套

all_data = [['John', 'Emily', 'Michael', 'Mary', 'Steven'], 
            ['Maria', 'Juan', 'Javier', 'Natalia', 'Pilar']]
names_i_want = [name for names in all_data for name in names if name.count('i')>0]
names_i_want
#result: ['Emily', 'Michael', 'Maria', 'Javier', 'Natalia', 'Pilar']

记住嵌套的顺序跟写for loop是一样的。

生成a list of list的嵌套方法。

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

推荐阅读更多精彩内容