学过php的朋友应该知道,在其他语言里面的数组啊,列表啊,字典啊,在php里通通用一个数组就搞定了。但是既然学python了,就要注意区分,不要被其他语言的习惯影响了。

下面我以PHP开发人员的角度,来谈谈我对python里数组的看法。

首先,我们知道,php的数组分为“索引数组”和“关联数组”。“索引数组”对应的就是python的列表(list),“关联数组”对应的就是python的字典(dict)。

接下来详细讲讲用法。

列表(list),左闭右开原则

list是一种有序的集合,可以随时添加和删除其中的元素。

也就是说,列表的下标是有序的,从0开始,可以根据下表读取元素,也可以进行其他操作。

# 声明、赋值
classmates = ['Michael', 'Bob', 'Tracy']
# 获取列表的长度
classmates_len = len(classmates)
print(classmates)
print(classmates_len)
# 访问列表元素(正数第几个,从0开始)
print(classmates[0])
print(classmates[1])
# 访问列表元素(倒数第几个,从-1开始)
print(classmates[-1])
print(classmates[-2])
# 追加元素
classmates.append('Adam')
print(classmates)
# 插入元素到指定位置
classmates.insert(1, 'Jack')
print(classmates)
# 删除列表末尾元素
classmates.pop()
print(classmates)
# 删除指定位置元素
classmates.pop(1)
print(classmates)
# 删除指定元素
classmates.remove('Bob')
# del语句
del classmate[2]
# 替换指定元素
classmates[1] = 'Sarah'
print(classmates)
# list里面的元素的数据类型也可以不同
L = ['Apple', 123, True]
print(L)
# 列表可嵌套
s = ['python', 'java', ['asp', 'php'], 'scheme']
# 打印php
print(s[2][1])
# 分片(不影响原列表,可以看成是拷贝的后续行为)
color = ['red','white','blue','pink','orange','black','green']
slice = color[2:5]
print(slice)  # >>> ['blue','pink','orange']
print(color) # >>> ['red','white','blue','pink','orange','black','green']
# 简写
slice = color[:2] # >>> 表示从0开始,相当于color[0:2]
slice = color[3:] # >>> 表示从序号3到最后全部
slice = color[:] # >>> 得到一份列表的拷贝

执行的结果:

如何将一个数字拆分成多个数字乘积python python 把一个数组分成三份_Python入门

range(5)可以生成一个list,生成的序列是从0开始小于5的整数

要计算1到n的累加和,只需要这样

a = range(n+1)
sum = 0
for b in a:
sum += b这里是0+1+2+…+n,相当于1+2+。。。+n

字典(dict)

Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。

也就是说,字典的下标不是有许多数字了,而是可以自定义的字符串,根据key也能很快找到value,是一种键值对的形式。就像查字典一样

# 声明、赋值
d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
print(d['Bob'])
# 把数据放入dict的方法,除了初始化时指定外,还可以通过key放入
d['Adam'] = 67
print(d)
# 替换
d['Adam'] = 33
print(d)
# 如果key不存在,dict就会报错,为了避免报错,可以用这样的写法,赋予默认值
print(d.get('Thomas', -1))
# 删除某个元素
d.pop('Bob')
print(d)

执行的结果为:

如何将一个数字拆分成多个数字乘积python python 把一个数组分成三份_python_02

和list比较,dict有以下几个特点:

  1. 查找和插入的速度极快,不会随着key的增加而变慢;
  2. 需要占用大量的内存,内存浪费多。

而list相反:

  1. 查找和插入的时间随着元素的增加而增加;
  2. 占用空间小,浪费内存很少。

所以,dict是用空间来换取时间的一种方法。

好了,在比较了这两种数据后,我们来看看另外两种类型。

元组(tupe)

元组就是不变的列表。

tuple的陷阱:当你定义一个tuple时,在定义的时候,tuple的元素就必须被确定下来。

如果你想定义一个空的tuple,你可以写成 d = ()

这里要注意一个事情!如果想定义一个只有一个元素的元组时,不能直接这样a = (3),这样会被认为a = 3,因为()不仅是元组,也可以被认为是数学的小括号,会产生歧义。要定义的话要这样写

# 定义
a = (3,)
print(a)

执行的结果为:

如何将一个数字拆分成多个数字乘积python python 把一个数组分成三份_android_03

tuple说是不变,其实也是相对的,比如

# "可变"tuple
b = ('a',23,['L','S'])
print(b)
b[2][1] = 'V'
print(b)

执行结果为:

如何将一个数字拆分成多个数字乘积python python 把一个数组分成三份_爬虫_04

看似变了,其实,这个b[2]的指向一直没变,只不是过他指向的那个list变了,这是list的事了,tuple管不了。tuple只是保证指向不变。

集合(set)

set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。

# 创建set,set没有重复元素,因为key不能重复
s = set([1,32,4])
print(s)
# 添加元素,重复的不会有效果
s.add(4)
s.add(5)
print(s)
# 通过remove(key)方法可以删除元素
s.remove(4)
print(s)
s.add('sun')
print(s)

执行的结果:

如何将一个数字拆分成多个数字乘积python python 把一个数组分成三份_android_05

总结一下:

key有序:列表(list),定义时用[]包裹,可变;元组(tuple),定义时用()包裹,不可变

key无序:字典(dict),定义时用{}包裹,键值对;set,定义时为a = set([…]),只有键,没有值

注:python好像也有专门的数组array,好像说是要引用什么模块。现在还没接触到,等接触到了再更新这篇文章。