Python题目练习(二)
1.如何实现对python列表去重,并保持原来顺序
li = [1,2,5,3,1,6,3,8,0,3,2,4]
l = []
for i in li:
if i not in l:
l.append(i)
print(l)
方法一
li = [1,2,5,3,1,6,3,8,0,3,2,4]
l = list(set(li))
l.sort(key=lambda i:li.index(i))
print(l) # 先去重,再按照li的索引进行排序
方法二
li = [1,2,5,3,1,6,3,8,0,3,2,4] from collections import OrderedDict
d = OrderedDict
d = d.fromkeys(li)
print(list(d.keys())) # 用有序字典进行去重排序
方法三
2.请给出二分查找的python示例代码
def search(li,i,start=0,end=None):
if end == None:end = len(li) - 1
if start <= end:
mid = (end - start) // 2 + start
if i < li[mid]:end = mid - 1
elif i > li[mid]:start = mid + 1
else:return '在该列表的第%s个数'%(mid + 1)
return search(li,i,start,end)
else:return '该列表没有这个数'
l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
print(search(l,42))
def select(l,aim,start = 0,end = None):
if end == None:
end = len(l)
if start > end:
return '列表没有该元素'
mid = (end - start) // 2 + start
if aim > l[mid]:
return select(l,aim,mid + 1,end)
elif aim < l[mid]:
return select(l,aim,start,mid - 1)
else:
return aim,mid
l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
print(select(l,42))
3.现有两元组(('a','b')),(('c','d')),请使用匿名函数生成列表[{'a':'c'},{'b':'d'}]
#方法一:
print(list(map(lambda t:{t[0]:t[1]},zip(('a','b'),('c','d'))))) #方法二:
test = lambda t1,t2:[{i:j} for i,j in zip(t1,t2)]
print(test(('a','b'),('c','d')))
4.用python实现'九九乘法表'(用两种不同的方式实现)
#方法一:
for j in range(1,10):
i = 1
l = []
while i <= j:
sum = i * j
l.append('%d * %d = %d'%(i,j,sum))
i += 1
print(' '.join(l)) #方法二:
j = 1
while j < 10:
i = 1
s = ''
while i <= j:
sum = i * j
s += '{} * {} = {} '.format(i,j,sum)
i += 1
print(s)
j += 1
5.三级菜单(可显示下级菜单,按q退出,按b返回)
menu = {
'北京': {
'海淀': {
'五道口': {
'soho': {},
'网易': {},
'google': {}
},
'中关村': {
'爱奇艺': {},
'汽车之家': {},
'youku': {},
},
'上地': {
'百度': {},
},
},
'昌平': {
'沙河': {
'老男孩': {},
'北航': {},
},
'天通苑': {},
'回龙观': {},
},
'朝阳': {},
'东城': {},
},
'上海': {
'闵行': {
"人民广场": {
'炸鸡店': {}
}
}
l = [menu]
while True:
ret = l[-1] #取列表最后一个元素
for k in ret:
print(k)
choice = input('请选择地点(按B/b返回,按Q/q退出):')
if choice in ret and ret[choice]:
l.append(ret[choice]) #添加到列表末尾
elif choice.upper() == 'B' and len(l) > 1:
l.pop() #删除列表末尾的元素
elif choice.upper() == 'Q':
break
列表增加删除法
def menu_tree(menu):
while True:
for k in menu:
print(k)
choice = input('请选择地点(按B/b返回,按Q/q退出):')
if choice.upper() == 'B' or choice.upper() == 'Q':
return choice
elif choice in menu and menu[choice]:
ret = menu_tree(menu[choice])
if ret == 'Q': return 'q'
menu_tree(menu)
递归函数法
6.哥德巴赫偶数拆分质数,请拆分100-120之间的哥德巴赫数。
def prime_num(n):
m = n ** 0.5
i = 2
while i < m+1:
if n % i == 0:
return False
i += 1
return True
for i in range(100,121):
a = 2
while a <= i/2:
b = i - a
ret1 = prime_num(a)
ret2 = prime_num(b)
if ret1 == True and ret2 == True:
print('%d = %d + %d'%(i,a,b))
a += 1
7.设计一个计算器,计算'1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'的结果
import re
def main(express):
express = express.replace(' ','') #对表达式去空格
while True:
express_bracket = re.search('\([^(]+?\)',express) #循环寻找带括号的式子
if express_bracket:
express_bracket = express_bracket.group()
result = real_express(express_bracket) #调用real_express函数
express = express.replace(express_bracket,result,1) #把式子替换成计算结果
else:break
return real_express(express) #调用real_express函数
def real_express(express):
while True:
real_exp = re.search('\d+\.?\d*[*/]-?\d+\.?\d*',express) #循环寻找乘法/除法式子
if real_exp:
real_exp = real_exp.group()
final_num = mul_div(real_exp) #调用mul_div函数
express = express.replace(real_exp,final_num,1) #把式子替换成计算结果
else:break
express = deal_symbol(express) #对式子处理符号
num_l = re.findall('-?\d+\.?\d*',express) #匹配式子的所有数字
sum = 0
for num in num_l:
sum += float(num) #将所有数字相加
return str(sum)
def mul_div(express):
if '*' in express: #判断是否是乘法式子
a,b = express.split('*')
return str(float(a) * float(b))
if '/' in express: #判断是否是除法式子
a,b = express.split('/')
return str(float(a) / float(b))
def deal_symbol(express): #处理符号
if '--' in express:express = express.replace('--','+')
if '-+' in express:express = express.replace('-+','-')
if '+-' in express:express = express.replace('+-','-')
if '++' in express:express = express.replace('++','+')
return express
express = '1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )'
print(main(express))
import re
def math(dic):
x,y = float(dic['x']),float(dic['y'])
if dic['mark'] == '*':return x * y
elif dic['mark'] == '/':return x / y
elif dic['mark'] == '+':return x + y
else:return x - y
def suansu(re_str):
ret = re.search('(?P<x>\d+\.?\d*)(?P<mark>[*/])(?P<y>-?\d+\.?\d*)',re_str)
try:
while True:
re_str = re_str.replace(ret.group(),str(math(ret.groupdict())))
if '++' in re_str:re_str = re_str.replace('++','+')
if '--' in re_str:re_str = re_str.replace('--','+')
ret = re.search('(?P<x>\d+\.?\d*)(?P<mark>[*/])(?P<y>-?\d+\.?\d*)', re_str)
except AttributeError:pass
ret = re.search('(?P<x>-?\d+\.?\d*)(?P<mark>[+-])(?P<y>-?\d+\.?\d*)',re_str)
try:
while True:
re_str = re_str.replace(ret.group(),str(math(ret.groupdict())))
ret = re.search('(?P<x>-?\d+\.?\d*)(?P<mark>[+-])(?P<y>-?\d+\.?\d*)', re_str)
except AttributeError:return re_str
def main(user_inp):
while True:
if not re.search('\([^(]+?\)',user_inp):
return suansu(user_inp)
else:
for i in re.findall('\([^(]+?\)',user_inp):
user_inp = user_inp.replace(i,suansu(i.replace('(','').replace(')','')))
while True:print(main(input('>>:').replace(' ','')))
import re
def math(x, y, z):
if y in ['*', '/', '+', '-']: return eval(f'{x} {y} {z}')
def deal_express(express, reg, flag=''):
while True:
ret = re.search(f'({flag}\d+\.?\d*)({reg})(-?\d+\.?\d*)', express)
if ret: express = express.replace(ret.group(), str(math(ret.group(1), ret.group(2), ret.group(3))))
else: return express
def count(re_str):
return deal_express(deal_express(re_str, '[*/]'), '[+-]', '-?')
def main(user_inp):
while True:
ret = re.search('\([^(]+?\)', user_inp)
if ret: user_inp = user_inp.replace(ret.group(), count(ret.group())[1: -1], 1)
else: return count(user_inp)
while True: print(main(input('>>:').replace(' ', '')))
16行代码实现
8.请用python函数实现n次登陆功能
def login(n,i = 1):
name = input('请输入用户名:').strip()
pwd = input('请输入密码:').strip()
if name == 'alex' and pwd == '':return '登陆成功'
elif i == n:return '您的账户已经被锁定'
else:
print('登陆失败,你还有%s次机会'%(n - i))
i += 1
return login(n,i)
print(login(3))
9.有两个序列a,b,大小都为n,序列元素的值任意整形数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
a = [1,3,5,8,3,24,53,11,34,56]
b = [6,51,32,45,65,77,88,99,34,44]
x = y = 0
min = abs(sum(a) - sum(b))
while x < len(a):
while y < len(b):
a[x],b[y] = b[y],a[x]
tmp = abs(sum(a) - sum(b))
if min > tmp:min = tmp
else:a[x],b[y] = b[y],a[x]
y += 1
x += 1
y = 0
print(min)
def change(a,b,x=0):
y = 0
num = abs(sum(a) - sum(b))
while y < len(b):
a[x],b[y] = b[y],a[x]
tmp = abs(sum(a) - sum(b))
if num > tmp:num = tmp
else:a[x],b[y] = b[y],a[x]
y += 1
x += 1
if x < len(a):return change(a,b,x)
return a,b,num
def change(a,b):
x = y = 0
num = abs(sum(a) - sum(b))
while x < len(a):
while y < len(b):
a[x],b[y] = b[y],a[x]
tmp = abs(sum(a) - sum(b))
if num > tmp:num = tmp
else:a[x],b[y] = b[y],a[x]
y += 1
y = 0
x += 1
return a,b,num
10.一个列表含有相同键的字典合并
list3 = [
{"name": "alex", "habit": "抽烟"},
{"name": "alex", "habit": "喝酒"},
{"name": "alex", "habit": "烫头"},
{"name": "alex", "habit": "Massage"},
{"name": "egon", "habit": "喊麦"},
{"name": "egon", "habit": "街舞"},
] 如何把上面的列表转换成下方的列表? list4 = [
{"name": "alex", "habit_list": ["抽烟", "喝酒", "烫头", "Massage"]},
{"name": "egon", "habit_list": ["喊麦", "街舞"]},
]
题目
dic = {}
for i in list3:
if i['name'] not in dic:
dic[i['name']] = {'name':i['name'],'habit_list':[i['habit']]}
else:
dic[i['name']]['habit_list'].append(i['habit'])
l = list(dic.values())
print(l)
方法一
list4 = []
for i in list3:
for j in list4:
if i['name'] == j['name']:
j['habit_list'].append(i['habit'])
break
else:
list4.append({'name':i['name'],'habit_list':[i['habit']]})
print(list4) # 注意:for..else语句,如果for循环里面没有break,执行完for循环后会继续执行else语句,如果for循环语句中有break,遇到break后,else语句不会执行
方法二
list3.sort(key=lambda i:i['name'])
l = []
dic = {'name':None,'habit_list':None}
for i in list3:
if i['name'] != dic['name']:
dic = {'name':i['name'],'habit_list':[i['habit']]}
l.append(dic)
else:
dic['habit_list'].append(i['habit'])
print(l) # 先对列表的name进行排序,再合并
方法三
Python题目练习(二)的更多相关文章
- python排序之二冒泡排序法
python排序之二冒泡排序法 如果你理解之前的插入排序法那冒泡排序法就很容易理解,冒泡排序是两个两个以向后位移的方式比较大小在互换的过程好了不多了先上代码吧如下: 首先还是一个无序列表lis,老规矩 ...
- 之前同事问到的一道python题目
Python面试题 之前同事问了一道Python题目如下,暂时归类为面试题 题目:把类似'123.456'的字符串转换成浮点型数据 方法一: >>> print '{:.3f}'.f ...
- Python 基础语法(二)
Python 基础语法(二) --------------------------------------------接 Python 基础语法(一) ------------------------ ...
- Python 数据分析(二 本实验将学习利用 Python 数据聚合与分组运算,时间序列,金融与经济数据应用等相关知识
Python 数据分析(二) 本实验将学习利用 Python 数据聚合与分组运算,时间序列,金融与经济数据应用等相关知识 第1节 groupby 技术 第2节 数据聚合 第3节 分组级运算和转换 第4 ...
- 初学 Python(十二)——高阶函数
初学 Python(十二)--高阶函数 初学 Python,主要整理一些学习到的知识点,这次是高阶函数. #-*- coding:utf-8 -*- ''''' 话说高阶函数: 能用函数作为参数的函数 ...
- python/MySQL练习题(二)
python/MySQL练习题(二) 查询各科成绩前三名的记录:(不考虑成绩并列情况) select score.sid,score.course_id,score.num,T.first_num,T ...
- Python/MySQL(二、表操作以及连接)
Python/MySQL(二.表操作以及连接) mysql表操作: 主键:一个表只能有一个主键.主键可以由多列组成. 外键 :可以进行联合外键,操作. mysql> create table y ...
- python下实现二叉堆以及堆排序
python下实现二叉堆以及堆排序 堆是一种特殊的树形结构, 堆中的数据存储满足一定的堆序.堆排序是一种选择排序, 其算法复杂度, 时间复杂度相对于其他的排序算法都有很大的优势. 堆分为大头堆和小头堆 ...
- python函数(二)
python函数(二) 变量的作用域 1.局部变量与全局变量 在函数内创建的变量被称为局部变量,这类变量的生命周期与函数相同,当函数执行完毕时,变量也就随之消失. 此类变量只能在函数内部调用,函数外不 ...
- Python爬虫利器二之Beautiful Soup的用法
上一节我们介绍了正则表达式,它的内容其实还是蛮多的,如果一个正则匹配稍有差池,那可能程序就处在永久的循环之中,而且有的小伙伴们也对写正则表达式的写法用得不熟练,没关系,我们还有一个更强大的工具,叫Be ...
随机推荐
- OTP
OTP 是 One Time Programable, 一次性可编程,一种存储器类型.顾名思义,只允许一次编程,后面无法修改. 在嵌入式系统当中,所有的代码和系统数据都是存储在flash芯片内部的,f ...
- C/C++中如何在main()函数之前执行一条语句?
在C语言中,如果使用GCC的话,可以通过attribute关键字声明constructor和destructor(C语言中如何在main函数开始前执行函数) #include <stdio.h& ...
- 通过dd命令显示硬盘的读写性能
测试vdb硬盘的读写速度 1.分区格式化挂载vdb硬盘 2.新建写入文件2 3.测试:文件2中写入数据,设置块大小为100M,拷贝块个数为5 经过测试:测试效果一般count越高越准确,建议为300, ...
- Python-数据类型 主键auto_increment
MySQL数据操作: DML========================================================在MySQL管理软件中,可以通过SQL语句中的DML语言来实 ...
- 20)django-session使用
一:目录 1)session原理 2)cookie与session对比 3)session配置 4)session使用 5)示例 二:session原理 Django的Session机制会向请求的浏览 ...
- Codeforces 993E Nikita and Order Statistics [FFT]
洛谷 Codeforces 思路 一开始想偏想到了DP,后来发现我SB了-- 考虑每个\(a_i<x\)的\(i\),记录它前一个和后一个到它的距离为\(L_i,R_i\),那么就有 \[ an ...
- SQL语句的行列转换
[一]行转列 1,查询原始的数据 /***这次练习的主题,行转列,列转行***/select * from Scores 2,得到姓名,通过group by select Student as '姓名 ...
- VMware虚拟机安装Linux系统centos7(一)
1.安装虚拟机(自行百度) 2.编辑虚拟机设置 光驱设置,镜像选择:(也可设置2核2G,基于自己计算机选择!) 3.点击开启此虚拟机(上下键选择安装,回车) 4.选择语言 5.设置 如果想安装图形化界 ...
- Confluence 6 生产环境备份策略
如果你是下面的情况,Confluence 的自动每日 XML 备份可能适合你: 正在评估使用 Confluence 你对数据库的管理并不是非常熟悉同时你的 Confluence 安装实例的数据量并不大 ...
- Confluence 6 增加和减少你许可证的用户数
增加你许可证的用户数 如果你使用的用户数超过你许可证允许的用户数的话,你的 Confluence 实例将会变成为只读. 只读的意思是没有用户可以创建和编辑内容,直到你的用户数满足你的许可证需求为止. ...