[Python Notes]
lamHo
septembre 2017

Introduction (1) 数据结构

tuple vs list vs array vs dictionary

Python中几种主要的数据结构——容器(container):

容器 container 特点
元组 tuple 有序
不可修改
列表 list 有序
数组 array ( numpy ) 有序
字典 dictionary 无序
查找速度快
key不可以重复且不可变
同一个dict的key/value都可以取任意类型的项目
浪费空间

本篇通过比较它们的存储方式和用法,分清这几种数据结构的异同。

  • list vs tuple

    • list 可修改:增减项目,修改项目
    • tuple 不可修改:可用于被保护、不需要修改的数据
  • list vs array

    • 内存地址
      • list 所有项目的内存地址可以不连续
      • array 连续的内存空间
    • 数据类型
      • list 任意类型的对象
      • array 对对象有限制:一旦声明数据类型,放入的每个项目都是同此类型的对象

1. tuple


In [1]:
# 定义一个tuple
tuple1 = ('bosco','ricky','pinky')
tuple1


Out[1]:
('bosco', 'ricky', 'pinky')

In [2]:
# 一个项目的 tuple
tuple2 = (5,)
tuple2


Out[2]:
(5,)

In [3]:
# 一次赋多值
x,y,z = tuple1
print(x,y,z)


bosco ricky pinky

In [4]:
# 用in判断
'bosco' in tuple1


Out[4]:
True

In [5]:
# 索引
tuple1[0]


Out[5]:
'bosco'

In [6]:
# string
tuple("money")


Out[6]:
('m', 'o', 'n', 'e', 'y')

2. list

list1


In [7]:
list1 = [16,2,53,24,5,36,67,80]
list1


Out[7]:
[16, 2, 53, 24, 5, 36, 67, 80]

In [8]:
# 索引 indexing
list1[5]


Out[8]:
36

In [9]:
# 分片 slicing
list1[:5]


Out[9]:
[16, 2, 53, 24, 5]

In [10]:
list1[3:]


Out[10]:
[24, 5, 36, 67, 80]

In [11]:
list1[-3:]


Out[11]:
[36, 67, 80]

In [12]:
list1[1:6]


Out[12]:
[2, 53, 24, 5, 36]

In [13]:
list1[-4:-1]


Out[13]:
[5, 36, 67]

In [14]:
list1[0:6:2]


Out[14]:
[16, 53, 5]

In [15]:
list1[6:0:-2]


Out[15]:
[67, 5, 53]

In [16]:
list1[::-3]


Out[16]:
[80, 5, 2]

In [17]:
# more functions
len(list1)


Out[17]:
8

In [18]:
max(list1)


Out[18]:
80

In [19]:
min(list1)


Out[19]:
2

In [20]:
# 改变元素
list1[1]=30
list1


Out[20]:
[16, 30, 53, 24, 5, 36, 67, 80]

In [21]:
# 增加元素
list1.append(4)
list1


Out[21]:
[16, 30, 53, 24, 5, 36, 67, 80, 4]

In [22]:
list1.sort()
list1


Out[22]:
[4, 5, 16, 24, 30, 36, 53, 67, 80]

list2


In [23]:
# 算数
list2 = ['alpha','beta','gamma','gamma','alpha','alpha']
list2.count('alpha')


Out[23]:
3

In [24]:
list2 = [2,56,8,2,9,9,47,2,2]
list2.count(2)


Out[24]:
4

list3


In [25]:
# 联合list
list3 = [56,8,7,91]
list3_add = [15,32,5]
list3.extend(list3_add)
list3


Out[25]:
[56, 8, 7, 91, 15, 32, 5]

list4


In [26]:
list4 = ['apple','banana','orange','peach']
list4.index('orange')            # 找出该元素位置


Out[26]:
2

In [27]:
list4.insert(2,'cherry')         # 在2号位插入新元素
list4


Out[27]:
['apple', 'banana', 'cherry', 'orange', 'peach']

In [28]:
list4.pop(1)         # 删除1号位元素(并显示被删除的元素)


Out[28]:
'banana'

In [29]:
list4


Out[29]:
['apple', 'cherry', 'orange', 'peach']

In [30]:
list4.remove('orange')        # 删除该元素(不显示被删除元素)
list4


Out[30]:
['apple', 'cherry', 'peach']

string


In [31]:
list('hey')


Out[31]:
['h', 'e', 'y']

In [32]:
sorted('hey')


Out[32]:
['e', 'h', 'y']

In [33]:
sentence = "Take it away"
sentence.find('it')       # i:5


Out[33]:
5

In [34]:
sen1 = ['hello','world','welcome','so','good']
sen2 = 'miao'
sen2.join(sen1)       # join函数(str):在sen1的每个元素之间插入sen2


Out[34]:
'hellomiaoworldmiaowelcomemiaosomiaogood'

In [35]:
sentence = "I toOK a Photo"
sentence.lower()          # 大写字母转小写


Out[35]:
'i took a photo'

In [36]:
sentence.upper()          # 小写转大写


Out[36]:
'I TOOK A PHOTO'

In [37]:
sentence = "it was my bro"
sentence.replace('bro','sis')         # 替换字符string


Out[37]:
'it was my sis'

3. array

creat an array by a list


In [38]:
import numpy as np

a = np.array([[18., 17., 16.], [14., 19., 18.]])         
a


Out[38]:
array([[ 18.,  17.,  16.],
       [ 14.,  19.,  18.]])

some functions about array


In [39]:
a.ndim      # rank of an array


Out[39]:
2

In [40]:
a.shape       # dimension or shape of an array (result is a tuple)


Out[40]:
(2, 3)

In [41]:
a.size       # total number of items


Out[41]:
6

In [42]:
a.dtype       # type of item (rq. array里面所有item都是同样的类型)


Out[42]:
dtype('float64')

some functions to creat special array with NumPy

np.arange
np.linspace
np.zeros
np.ones
np.eye
np.diag

np.arange ( a=0,b,step=1 )
a开始取值,直到b之前
:如果step不是整数,用linspace更好。


In [43]:
np.arange(15)


Out[43]:
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])

In [44]:
np.arange(3,9)


Out[44]:
array([3, 4, 5, 6, 7, 8])

In [45]:
np.arange(3,9,2)


Out[45]:
array([3, 5, 7])

np.linspace ( a,b,num=50 )
a开始取num个值,直到b之前


In [46]:
np.linspace(3,9,5)


Out[46]:
array([ 3. ,  4.5,  6. ,  7.5,  9. ])

np.zeros( shape )


In [47]:
np.zeros(3)


Out[47]:
array([ 0.,  0.,  0.])

In [48]:
np.zeros((3,2))


Out[48]:
array([[ 0.,  0.],
       [ 0.,  0.],
       [ 0.,  0.]])

np.ones( shape )


In [49]:
np.ones(3)


Out[49]:
array([ 1.,  1.,  1.])

In [50]:
np.ones((3,2))


Out[50]:
array([[ 1.,  1.],
       [ 1.,  1.],
       [ 1.,  1.]])

np.eye( N )


In [51]:
np.eye(3)


Out[51]:
array([[ 1.,  0.,  0.],
       [ 0.,  1.,  0.],
       [ 0.,  0.,  1.]])

np.diag( v )


In [52]:
np.diag([5,3,6])


Out[52]:
array([[5, 0, 0],
       [0, 3, 0],
       [0, 0, 6]])

4. dictionary

creat a dictionary

key: value
字典键: 字典值


In [53]:
family = {'Dad':'Dickson','Mom':'Sara','Bro':'Bosco'}
family


Out[53]:
{'Bro': 'Bosco', 'Dad': 'Dickson', 'Mom': 'Sara'}

In [54]:
family['Dad']


Out[54]:
'Dickson'

键不可变,可以是数字、字符串、元组。


In [55]:
dict1 = {'a':5,666:'yoooo',(12,'b'):('c','d')}
dict1


Out[55]:
{'a': 5, 666: 'yoooo', (12, 'b'): ('c', 'd')}

copy a dictionary


In [56]:
home = family.copy()
home


Out[56]:
{'Bro': 'Bosco', 'Dad': 'Dickson', 'Mom': 'Sara'}

check key in dictionary


In [57]:
'Mom' in home


Out[57]:
True

In [58]:
'Sis' in home


Out[58]:
False

check values in dictionary


In [59]:
'Bosco' in home.values()


Out[59]:
True

clear a dictionary


In [60]:
family.clear()
family


Out[60]:
{}

modify a dictionary


In [61]:
user = {'name':'Bosco','age':40,'sex':'male'}
user


Out[61]:
{'age': 40, 'name': 'Bosco', 'sex': 'male'}

In [62]:
user['age'] = 32      # 修改一个value
user


Out[62]:
{'age': 32, 'name': 'Bosco', 'sex': 'male'}

In [63]:
user['city'] = 'New York'      # 添加一个项目
user


Out[63]:
{'age': 32, 'city': 'New York', 'name': 'Bosco', 'sex': 'male'}

In [64]:
del user['sex']      # 删除一个项目
user


Out[64]:
{'age': 32, 'city': 'New York', 'name': 'Bosco'}

5. transform

  • 转 tuple:tuple 函数 ( list / array / dictionary )
  • 转 list:list 函数 ( tuple / array / dictionary )
  • 转 array:np.array 函数 ( tuple / list )

In [65]:
list1 = [5,9,88,26,19]
type(list1)


Out[65]:
list

In [66]:
tuple1 = [75,31,4,60]
type(tuple1)


Out[66]:
list

In [67]:
array1 = np.array([62,8,99,6])
type(array1)


Out[67]:
numpy.ndarray

In [68]:
dict1 = {'a':5,666:'yoooo',(12,'b'):('c','d')}
type(dict1)


Out[68]:
dict
  • list / array / dictionary 转 tuple

In [69]:
l_to_t = tuple(list1)
type(l_to_t)


Out[69]:
tuple

In [70]:
a_to_t = tuple(array1)
type(a_to_t)


Out[70]:
tuple

In [71]:
# key to tuple
d_to_t = tuple(dict1)
d_to_t


Out[71]:
('a', 666, (12, 'b'))

In [72]:
# value to tuple
dv_to_t = tuple(dict1.values())
dv_to_t


Out[72]:
(5, 'yoooo', ('c', 'd'))
  • tuple / array / dictionary 转 list

In [73]:
t_to_l = list(tuple1)
type(t_to_l)


Out[73]:
list

In [74]:
a_to_l = list(array1)
type(a_to_l)


Out[74]:
list

In [75]:
# key to list
d_to_l = list(dict1)
d_to_l


Out[75]:
['a', 666, (12, 'b')]

In [76]:
# value to list
dv_to_l = list(dict1.values())
dv_to_l


Out[76]:
[5, 'yoooo', ('c', 'd')]
  • list / tuple 转 array

In [77]:
l_to_a = np.array(list1)
type(l_to_a)


Out[77]:
numpy.ndarray

In [78]:
t_to_a = np.array(tuple1)
type(t_to_a)


Out[78]:
numpy.ndarray