list

A list is a sequence of anything

In [1]:
t1 = [2,3,4]             # 使用中括号创建list
t2 = list(t1)             # 使用list()函数创建list, 用另一个序列初始化
t3 = [t1, t2]             # t3 is a list of two lists
t4 = [*t1, 5]             # use scatter to unfold t1, and then used to form t4
t5 = list('use a string to create a list') # 使用字符串初始化list
t6 = [4, 'string', 4.5, t1]   # list中的元素可以是不同的数据类型

print('t1 : ', t1)
print('t2 : ', t2)
print('t3 : ', t3)
print('t4 : ', t4)
print('t5 : ', t5)
print('t6 : ', t6)
t1 :  [2, 3, 4]
t2 :  [2, 3, 4]
t3 :  [[2, 3, 4], [2, 3, 4]]
t4 :  [2, 3, 4, 5]
t5 :  ['u', 's', 'e', ' ', 'a', ' ', 's', 't', 'r', 'i', 'n', 'g', ' ', 't', 'o', ' ', 'c', 'r', 'e', 'a', 't', 'e', ' ', 'a', ' ', 'l', 'i', 's', 't']
t6 :  [4, 'string', 4.5, [2, 3, 4]]

与list相关的操作

In [2]:
# 通过下标访问元素
t1[0] = 0
print('t1 : ', t1)

# 使用 for 遍历list:
for x in t1: print(x)

# 使用 下标遍历 list
for i in range(len(t1)): 
    print( 't1[{0}] = {1}'.format(i, t1[i]) )  #使用了格式化输出{}中的数字使用format()中对应位置的参数替换

# 使用+号连接两个list
print('t1 + t2 : ', t1 + t2)

# 使用乘号*重复一个list
print('t1 * 3 : ' , t1 * 3 )

# 往列表末尾添加一个元素
t1.append(5)
print('t1 : ', t1)

#往列表里面添加另一个列表的所有元素(可以是自己)
t1.extend(t1)
print('t1 : ', t1)

# 对列表排序
t1.sort()
print('t1 : ', t1)

#删除列表里面的元素

t1.pop()  # 删除最后的一个元素
del t1[0]  # 删除下标为0的元素
print('t1 : ', t1)

del t1[1:3] # 删除下标为1,2的元素
print('t1 : ', t1)

t1.remove(4) #删除第一个元素值为4的元素
print('t1 : ', t1)
t1 :  [0, 3, 4]
0
3
4
t1[0] = 0
t1[1] = 3
t1[2] = 4
t1 + t2 :  [0, 3, 4, 2, 3, 4]
t1 * 3 :  [0, 3, 4, 0, 3, 4, 0, 3, 4]
t1 :  [0, 3, 4, 5]
t1 :  [0, 3, 4, 5, 0, 3, 4, 5]
t1 :  [0, 0, 3, 3, 4, 4, 5, 5]
t1 :  [0, 3, 3, 4, 4, 5]
t1 :  [0, 4, 4, 5]
t1 :  [0, 4, 5]

切片

切片语法可以作用在list, tuple, str等这些线性数据结构上 python, matlab, octave这些脚本语言中都有类似的切片语法.

切片是生成list的一种语法

In [3]:
t = [0,1,2,3,4,5,6,7,8,9,10]
print('t[:3] = ', t[:3])  # 获取[0:3)范围的元素
print('t[3:] = ', t[3:])  # 获取从3开始的所有元素
print('t[3:-1] = ', t[3:-1])     # -1表示最后一个位置, -2表示倒数第2个位置, 依次类推

#使用步长获取固定步长的元素
print('t[ : :1] = ', t[ : : 1])  
print('t[ : :2] = ', t[ : : 2])
print('t[ 1: -1 :3] = ', t[ 1: -1 : 3])

# 使用切片复制一个list
tt = t[ : ]
print('tt : ', tt)

# 切片可以作为左值使用
tt[3:8] = [0]   # 用列表[0] 覆盖列表 tt[3:6]
print('tt : ', tt)
t[:3] =  [0, 1, 2]
t[3:] =  [3, 4, 5, 6, 7, 8, 9, 10]
t[3:-1] =  [3, 4, 5, 6, 7, 8, 9]
t[ : :1] =  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
t[ : :2] =  [0, 2, 4, 6, 8, 10]
t[ 1: -1 :3] =  [1, 4, 7]
tt :  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
tt :  [0, 1, 2, 0, 8, 9, 10]

map, reduce, filter

高阶函数, 使用另一个函数作为参数, 来作用于集合中的元素上
大部分复杂的集合操作都可以通过这三种操作的结合来实现

map

map(fun, lst), 第一个参数是一个只接收一个参数的函数, 第二个参数是一个可以迭代的序列
map将fun作用于lst中的每一个元素, 可以认为map封装fun对lst[i] 的操作
通过list()可以将map对象转换为list对象 map示意图

In [4]:
# 比如字符串类中就有与map作用类似的函数
s = 'abcdefg'
print(s.upper()) # 将s中的每一个元素都转换为大写字母

low = list(s); 
print('low : ', low)
up = map(str.upper, low)  # 第一个参数是一个函数, 第二个参数是一个list
print('up : ', up)
list_up = list(up)
print('list_up : ', list_up)
ABCDEFG
low :  ['a', 'b', 'c', 'd', 'e', 'f', 'g']
up :  <map object at 0x0000000004C10F60>
list_up :  ['A', 'B', 'C', 'D', 'E', 'F', 'G']

reduce

reduce(fun, lst) 第一个参数是一个函数, 第二个参数是一个可以迭代的序列
reduce将函数fun作用到lst的每个元素上并产生一个输出

In [5]:
from functools import reduce 

# 举个栗子
lst = [1,2,3,4,5,6]
print('sum(lst) = ', sum(lst) ) # 这一步可以理解为add(add(add(add(add(1, 2), 3), 4), 5), 6)

# reduce 就是这样工作的
def myadd(a, b):
    return a+b
result = reduce(myadd, lst)
print('result : ', result)

#再举一个栗子, 写一个函数判断一个数字是否是回文数
def is_palindrome1(n):
    return str(n) == reduce(lambda x,y : y + x, str(n) )

def is_palindrome2(n):
    return list(str(n)) == list(reversed(list(str(n))))

print(is_palindrome1(1234321))
print(is_palindrome2(1234321))
sum(lst) =  21
result :  21
True
True

filter

filer(fun, lst) 第一个参数是一个函数, 第二个参数是一个可以迭代的序列
filter将函数fun作用于lst的每一个元素, 并根据fun返回值是 Ture 还是False 决定保留还是丢弃该元素
使用 filter 也需要导入functools 模块

In [6]:
lst = [i for i in range(10)]
print(lst)

def is_odd(n): 
    return n % 2 == 1

print( list(filter(is_odd, lst)) ) # 过滤掉偶数

lst = list('this is a string')
print(lst)

def not_empty(s):
    return s and s.strip()

print( list(filter(not_empty, lst)) )
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 3, 5, 7, 9]
['t', 'h', 'i', 's', ' ', 'i', 's', ' ', 'a', ' ', 's', 't', 'r', 'i', 'n', 'g']
['t', 'h', 'i', 's', 'i', 's', 'a', 's', 't', 'r', 'i', 'n', 'g']

List comprehensions (列表生成式)

列表生成式是一种简洁且高效的生成list对象的一种语法 看例子:

In [2]:
t1 = [ x**2 for x in range(10) ]  # 生成0到4的平方,作为列表元素
print( t1 ) 

t2 = [ x for x in t1 if  x % 2 ]  # 当后面的if 条件为True时, 当前元素才会保留下来, 这里只保留了奇数
print( t2 )
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
[1, 9, 25, 49, 81]