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]]
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容