第8次全天课笔记-20180902
今早练习1:将字符串:"k:1|k1:2|k2:3|k3:4",处理成 python 字典:{'k':'1', 'k1':'2', 'k2':'3','k3':'4' }
s = "k:1|k1:2|k2:3|k3:4" result = {} a = s.split("|") print(a) for i in a: key,value = i.split(":") result[key] = value print (result)
出一个题:{'k': '1', 'k1': '2', 'k2': '3', 'k3': '4'} 拼回:"k:1|k1:2|k2:3|k3:4"
字典的key取出来,然后用sort或者sorted均可
>>> sorted(d.keys())
['k', 'k1', 'k2', 'k3']
算法:
1 先把字典的key排序
2 然后按照排序后的key,依次取value,然后使用:,
把key和value做拼接,然后把拼接后的结果存到一个列表里面
3 使用join,使用|将列表的所有元素做拼接
d = {'k': '1', 'k1': '2', 'k2': '3', 'k3': '4'} result = [] for key in sorted(d.keys()): s= key+":"+d[key] result.append(s) print (result) print ("|".join(result))
练习题2:题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
- 程序分析:在10万以内判断
import math def pingfang(x): for i in range(1,int(math.sqrt(x))+1): if i*i == x: return True return False for j in range(1,100000): if pingfang(j+100) and pingfang(j+100+168): print(j)
练习题3:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。
def get_weekday_word(): s = ["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"] #如果是list,换行不用加斜杠 first_letter = input("请输入一个字母:") result = [] for i in s: if first_letter.lower() == i[0].lower(): result.append(i) if len(result) == 0: return "" if len(result) == 1: return result[0] if len(result) == 2: second_letter = input("请输入第二个字母:") for j in result: if j[1] .lower()== second_letter.lower(): return j else: return "" print(get_weekday_word())
for else 这个return
程序中的else语句是便于处理某种行为,在循环的正常终止时执行:即以return或者break方式退出循环将会忽略else语句;存在continue语句将会执行else。
a= [-1,2,3,-3,0,-5,5]
生成一个新列表,-1的左边都是小于它的,右边都是大于它的。
a= [-1,2,3,-3,0,-5,5] base = a[0] list1=[] list2=[] for i in a[1:]: if i>=base: list2.append(i) else: list1.append(i) print(list1+[base]+list2)
在列表中插入一个新的元素 [100, 2, 3, -3, 0, -5, 5]
在0的前面插入一个元素10000
result = [] a = [100, 2, 3, -3, 0, -5, 5] target_num =10000 for i in a: if i == 0: result.append(target_num) result.append(i) else: result.append(i) print (result)
2 在列表中的第三个位置插入10000
算法:使用切片把第三个位置前的取到,使用切片把位置三后的取到,把10000存到一个列表,三个列表相加
result = [] a = [100, 2, 3, -3, 0, -5, 5] target_num =10000 result=a[:2]+[target_num]+a[2:] print(result)
切片赋值 (切片可多可少)
>>> a
[[-1, -2], 2, 3, -3, 0, -5, 5]
>>> a[0:2]=[1,2,3]
>>> a
[1, 2, 3, 3, -3, 0, -5, 5]
>>> a[0:2]=[-1]
>>> a
[-1, 3, 3, -3, 0, -5, 5]
切片取值
>>> a[:]
[-1, 3, 3, -3, 0, -5, 5]
>>> a[:-1]
[-1, 3, 3, -3, 0, -5]
>>> a[::2]
[-1, 3, 0, 5]
Remove删除元素
>>> if 3 in a:
... a.remove(3)
...
>>> a
[-3, 0, -5, 5]
遍历的时候,不要删除原列表,容易搞错
>>> a=[1,1,1,1,2,3]
>>> for i in a:
... if i == 1:
... a.remove(1)
...
>>> a
[1, 1, 2, 3]
先计算有多少个,然后删除N遍
>>> for i in range(a.count(1)):
... a.remove(1)
...
>>> a
[2, 3]
或者是try except判断
>>> a= [1,1,1,1,1,2,3]
>>> while 1:
... try:
... a.remove(1)
... except:
... break
...
刻意练习:坚持写
预习视频,看着手把手把代码敲了一遍。
不断重复看,继续打印变量,继续看。
不会马上就去问。把作业都写了一遍。
py3:简单看了看,作业又写了一遍。
现在:每周定个目标,每周看啥。
对着ppt所有内容看一遍,作业做一遍
核心编程第二版在看。
精力允许。
可以把某些模块,系统练习一遍。按照吴老师的ppt.
公司不能上网,只能敲代码。
晚上9点下班-11点练习代码
日报:周末,日报压力比较大。
1个月左右,不是那么抗拒了,成为生活的一部分
全天课一天300-500行,大概。漏掉了,可以复习,看看别人的。
可以用新的方法解决旧的问题。
坚持的刻意练习。不加班、不带娃
定个目标:看别人的日报。必看洪强同学。
最后:
优秀的人是持续的自律,共同进步,成为更好的自己。升职加薪。量变引起质变。
学习方法:
1 算法写出来
2 把算法翻译成代码
实践+思考
看别人的,总结出来算法。
在看一遍,在写
不断的练习。
时间的投入是必须的。思考,基本的知识点。多做几遍。
对于加班:
能力够,不加班
加班是态度的体现。
能力不够,靠加班。
坚持:
做一个事情,收集很多信息,处理它。(冷启动)
周期长一点点,且没有成就感。
改进:
驱动力
制动力:没有正反馈,缺乏激励。
练习:
[1,-1,2,-2,3,-3]
max()排序
每次找到列表最大值,存到新的list,
在老的list里面删掉一个。
继续重复上面的过程,直到所有的元素都到新list.
1 升序
2 降序
方法1:
a= [1,-1,2,-2,3,-3] result =[] for i in range(len(a)): result.append(max(a)) a.remove(max(a)) print (result) result.reverse() print (result)
a= [1,-1,2,-2,3,-3] result =[] for i in range(len(a)): result.insert(0,max(a)) a.remove(max(a)) print (result)
列表的操作,list() 工厂类
>>> list((1,2,34))
[1, 2, 34]
>>> list({1:2,3:4})
[1, 3]
>>> list("abc")
['a', 'b', 'c']
>>> list((1,2,3))
[1, 2, 3]
a = "abcdefghi"
把开头、结尾、中间位置的字母变为1
其他字母不变
a = "abcdefgh" a = list(a) a[0]='1' a[-1]='1' mid = len(a)//2 if len(a)%2 == 0: a[mid] = '1' a[mid-1] = '1' else: a[mid] ='1' print("".join(a))
operator函数
>>> 6>>1 #右移
3
>>> 12>>1
6
>>> 12>>2
3
>>> 1<<2 #左移
4
>>> 1<<4
>>> a = [(1,),(1,1),(1,2,3),(2,2)]
>>> def func(b):
... return len(b)
...
>>> a.sort(key = func)
>>> a
[(1,), (1, 1), (2, 2), (1, 2, 3)]
>>> a.sort(key = func,reverse = True)
按照所有元素的和求值
a = [(-1,),(1,1),(-2,2,3),(2,2)]
def func(b):
return sum(b)
a.sort(key = func)
print(a)
找到英文句子中最长的单词
s = "I am a boy! hi , glory road"
算法1:
1 使用空格分割,列表
2 遍历列表,每个词
3 max_length =0
4 max_word =""
s = "I am a boy! hi , glory road hello" max_length =0 max_word =[] word_list = s.split() for word in word_list: if len(word)>max_length: max_length = len(word) max_word = [word] elif len(word)==max_length: max_word.append(word) print (max_word)
s = "I am a boy! hi , glory road hello" word_list = s.split() word_list.sort(key=lambda x:len(x)) for word in word_list: if len(word) == len(word_list[-1]): print (word)
列表的复制
【引用复制】
>>> a = [1,2]
>>> b=a
>>> id(b)
31980744
>>> id(a)
31980744
>>> b.append(3)
>>> a
[1, 2, 3]
【不引用复制】
>>> a
[1, 2, 3]
>>> b=a[:]
>>> b
[1, 2, 3]
>>> id(a)
31980744
>>> id(b)
31980936
>>> b.append(4)
>>> b
[1, 2, 3, 4]
>>> a
[1, 2, 3]
小练习:
生成一个学生资料库:
每个学生:名字 班级 考试成绩(科目名称,成绩)
[名字 班级 考试成绩 [科目名称,成绩]]
请实现一个学生信息和成绩的录入,以及查询
以及更新和删除。
print ("欢迎来到熊孩子成绩管理系统!") print (""" 可操作的命令如下: add_info:可以添加学生的名字和班级 add_grade:可以增加学生的考试成绩 modify_grade:可以修改学生的考试成绩 get_grade:可以获得学生的某个学科考试成绩 delete_grade:可以删除学生的某个学科考试成绩 """) xionghaizi_info = [] def add_info(info): if len(info) > 0: print("信息已存在") return name = input("请输入学生的名字:") info.append(name) class_info = input("请输入学生的班级") info.append(class_info) def add_grade(info): if len(info) >=3: subject = input("请输入学生的考试科目:") for i in info[2:]: if i[0] == subject: print("此学科成绩已存在") return else: grade = input("请输入学生此科目的考试成绩:") info.append([subject,grade]) else: subject = input("请输入学生的考试科目:") grade = input("请输入学生此科目的考试成绩:") info.append([subject,grade]) def modify_grade(info): if len(info) >=3: subject = input("请输入要修改的学生考试科目:") for i in info[2:]: if i[0] == subject: grade = input("请输入学生此科目的更改后考试成绩:") i[1] = grade return else: print ("此学科的成绩不存在,无法修改:") else: print ("此学生没有成绩,无须修改:") def get_grade(info): if len(info) >=3: subject = input("请输入要查询的学生考试科目:") for i in info[2:]: if i[0] == subject: print(i[1]) return else: print ("此学生无此科目成绩,无法查询!") else: print ("此学生无科目成绩,无法查询!") def del_grade(info): if len(info) >=3: subject = input("请输入要删除的学生考试科目:") for i in info[2:]: if i[0] == subject: info.remove(i) return else: print ("此学生无此科目成绩,无法查询!") else: print("此学生无成绩可以删除!") print ("请初始化学生信息:") add_info(xionghaizi_info) while 1: command = input("请输入你的命令:") if command == ".": print ("bye!") break elif command == "add_grade": add_grade(xionghaizi_info) elif command == "modify_grade": modify_grade(xionghaizi_info) elif command == "get_grade": get_grade(xionghaizi_info) elif command == "del_grade": del_grade(xionghaizi_info)
推导列表
>>> [x for x in range(2,7,2)]
[2, 4, 6]
>>> [x*2 for x in range(2,7,2)]
[4, 8, 12]
>>> [x**2 for x in range(1,11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
[x**2 for x in range(1,11) if x %2==0]
六剑客
Map,filter,reduce,切片,lambda,推导列表
输出 10-30 用两个for
>>> [int(x+y) for x in ["1","2","3"] for y in map(str,range(10)) if int(x+y)<=30]
d = {'x': 'A', 'y': 'B', 'z': 'C' }
print ([k + '=' + v for k, v in d.items()])
求字典key中数字的和
>>> [key for key in {1:'a',2:"b","a":3} if isinstance(key,int)]
[1, 2]
>>> sum([key for key in {1:'a',2:"b","a":3} if isinstance(key,int)])
3
求字典key,value中数字的和
两个列表相加
sum([key for key in {1:'a',2:"b","a":3} if isinstance(key,int)]+[value for value in {1:'a',2:"b","a":3}.values() if isinstance(value,int)])