列表就是一个序列
这些都是列表:
[10,20,30,40]
['curunch','lark']
['spam',10,20,[10,20]] # 可以嵌套列表
定义列表
cheeses = ['Cheddar','Edam']
numbers = [32,123]
empty = []
print(cheeses,numbers,empty)
列表是可改变数值
numbers = [4,3]
numbers[1] = 1
print(numbers) # 结果为 4,1
in 语句
'Edam' in cheeses # True
'Bred' in cheeses # False
遍历列表
# for语句遍历之元素遍历
for cheese in cheeses:
print(cheese)
# for语句遍历之系数遍历
for i in range(len(numbers)):
numbers[i] = numbers[i] * 2
# 列表 +
a = [1,2,3]
b = [4,5 ,6]
c = a + b
print(c) # [1,2,3,4,5,6]
# 列表 *
[0 ] * 4 #[0,0,0,0]
[1,2,3] * 4 [1,2,3,1,2,3,1,2,3]
列表的切片
t = ['z','a','b','c','d','e','f']
t[1:3]
t[:4]
t[3:]
t[:]
t[1:3] = 'x','y'
print(t) # ['z','x','y','c','d','e','f']
列表的方法
添加元素
t = ['z','a','b','c','d','e','f']
t.append('g')
增加元素:两个列表
t = ['z','a','b','c','d','e','f']
t1 = ['m','n']
t.extand(t1)
删除元素
# remove
t = ['z','a','b','c','d','e','f']
t.remove('z')
# pop 当你知道要删除的元素的序列,且也要提取被删除的元素时
l = ['a','b','c']
x = l.pop(1)
print(x) # b
print(l) # ['a','c']
# 跟pop一样,当你不需要提取被删除元素时可以用 del
l = ['a','b','c']
del l[1]
print(l) # ['a','c']
## del 还可以删除切片部分
l = ['a','b','c','d']
del l[1:2]
print(l) # ['a','d']
排序
# 排序
t = ['z','a','b','c','d','e','f']
t.sort()
Map,filter,reduce
- 合成一序列元素为一个单一的值:reduce缩小
```python
计算列表中值的和
t = [1,4,5,6,7,8,9,11,14] sum = 0 for i in t: sum += i print(sum)
内置函数求和
sum(t)
2. 使用迭代的方式进行计算:map
```python
def capitalize_all(t):
res= []
for i in t:
res.append(i.capitalize())
return res
str_all=['My','name' , 'is' ,'ddddd.', 'I', 'want' ,'to' ,'play','basketball']
print(capitalize_all(str_all))
- 只选择一部分元素,组成新的列表:filter过滤器
def is_upper(list):
res=[]
for s in list:
if s.isupper():
res.append(s)
return res
str_all=['My','NAME' , 'is' ,'ddddd.', 'I', 'want' ,'to' ,'play','basketball']
print(is_upper(str_all))
列表和字符串
s = 'spam'
li = []
li = list(s)
print(li)
#split 默认情况下,按照空格切割
s = 'my name is dddd, How are you?'
li= s.split()
print(li) #['my', 'name', 'is', 'dddd,', 'How', 'are', 'you?']
#split函数给参数时,根据参数的符号进行切割
s2 = 'span - spam - spal'
delimiter = "-"
li = s2.split(delimiter)
print(li)
li2 = ['my', 'name', 'is', 'dddd,', 'How', 'are', 'you?']
s3 = ' '.join(li2) #如果''之内没有空格的话,s3将会没有空格作为单词的分割
print(s3)
新建(create)和引用(modify)
t1 = [1,2]
t2 = t1.append(t1)
print(t1) # [1,2]
print(t2) # none
t3 = t1 + [4]
print(t3) # [1, 2, 3, 4]
def delete_head(t):
return t[1:]
def delete_head_2(t):
del t[0]
return t
delete_head(t3)
delete_head_2(t3)
Debugging
- 大多数列表方法修改参数以及返回None;大多数字符串方法返回一个新的str以及留下原来的参数
- 列表方法有很多种,例如添加元素(append和”+”);删除元素(pop ,remove,del和切片)形成自己的固定的方式.避免犯语法错误.
- copy是为了同名(aliasing)
t = [3,1,2]
t2 = t[:]
t2.sort()
#还可以用内置函数sorted
t3 = sorted(t)
t3
t
练习题
- 写一个函数nested_sum,它的作用是调取列表中以及嵌套的列表中所有的数字,并返回所有数之和.例如t=[[1,2],[3],[4,5,6]] 返回值是21
t= [[1,2],[3],[4,5,6]]
def nested_sum (t):
sum = 0
for l in t:
for i in l:
sum = sum + i
return sum
nested_sum(t)
- 写一个函数cumsum,它的作用是调取列表中所有的数字,返回一个新的列表,新的聊表中所有元素都是前面元素的之和;例如t=[1,2,3]返回的列表是[1,3,6]
t = [1,2,3]
def cumsum(t):
new_t=[]
sum = 0
for i in t:
sum = sum +i
new_t.append(sum)
return new_t
cumsum(t)
- 写一个函数middle,它的作用是返回新的列表,列表是剔除了最前和最后两个元素.
t = [12,32,44,55,63,'wq','2']
def middle(t):
return t[1:-1]
middle(t)
- 编写一个函数is_sorted,它的作用是判断列表是不是排序好的,如果是返回TRUE,否则返回False
t = [1,2,4,6]
t_no = [2,3,1,0]
def is_sorted(t):
t2 = sorted(t)
if t == t2:
return True
else:
return False
print(is_sorted(t))
print(is_sorted(t_no))
- 写一个函数is_anagram,它的作用是输入两个字符串,判断是否为同字母异词序.
str1 = 'abcdefg'
str2 = 'gfedcba'
str3 = 'dadadlks'
def is_anagram(s1,s2):
#将两个字符串转换为列表
list1 = list(s1)
list2 = list(s2)
#print(list1,list2)
#将两个列表排序
list1.sort()
list2.sort()
#判断是否为一致
if list1 == list2:
return True
else :
return False
is_anagram(str1,str2)
is_anagram(str1,str3)
- 编写一个函数has_duplicates ,它的作用是如果一个列表中至少有一个重复的元素,返回True。不能修改原列表。
# 用append方法将原列表中不重复的元素添加到新列表,最后比较长度。
lst = [1,8,4,5,2,9,3]
def has_duplicates(t):
new_list = []
for i in t:
if i not in new_list:
new_list.append(i)
if len(t) == len(new_list):
return False
else :
return True
has_duplicates(lst)
# 用set的方式,再通过比较len长度。
lst = [1,2,4,5,2,9,3]
# print(new_set)
def has_duplicates_2(t):
new_set = set(t)
if len(new_set) == len(t):
return False
else :
return True
has_duplicates_2(lst)
# 通过排序,再对两个相邻的元素进行比较。
lst = [1,2,4,5,2,9,3]
def has_duplicates_3(t):
s = t[:]
s.sort()
for i in range(len(s)-1):
if s[i] == s[i+1] :
return True
return False #返回False不能在for循环中
has_duplicates_3(lst)
- 有趣的生日,假设一个班级有23名学生,模拟一下1000次随机生日的情况下,统计班级当中有同一个生日的次数。需要模块random,random_bdays函数随机模拟n名学生的生日,count_matchs函数记录n名同学在m次模拟过程中有多少次是有相同生日的次数。main函数进行整合。
# 用append方法将原列表中不重复的元素添加到新列表,最后比较长度。
lst = [1,8,4,5,2,9,3]
def has_duplicates(t):
new_list = []
for i in t:
if i not in new_list:
new_list.append(i)
if len(t) == len(new_list):
return False
else :
return True
# 判断是否有同一个生日的,如果有计数count + 1,num_total为模拟的次数
def count_matchs(num_students,num_total):
count = 0
for i in range(num_total):
t = random_bdays(num_students)
if has_duplicates(t) :
count = count + 1
return count
# 给N个学生,随机产生N个学生的生日,并返回存储生日数的列表
def random_bdays(n):
t = []
for i in range(n):
t.append(random.randint(1,365))
return t
def main():
num_students = 23
num_total = 1000
count = count_matchs(num_students,num_total)
print('after {} times simulate'.format(num_total))
print('There are {} students in this calss'.format(num_students))
print(count)
if __name__ = '__main__':
main()
"""
after 1000 times simulate
There are 23 students in this calss
509
尝试几次之后很多时候都是在500上下
"""