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 ...
随机推荐
- web@前端--html,css,javascript简介、第一个页面(常用标签简介)
1.什么是标签#1.在HTML中规定标签使用英文的的尖括号即`<`和`>`包起来,如`<html>`.`<head>`.`<body>`都是标签,#2. ...
- MySQL--视图view、触发器trigger、事务(start transaction)、存储过程(特殊的数据逻辑处理函数)、流程控制(if,case....)
mysql致力于项目开发及数据库管理之间解耦合(帮忙封装一些数据处理方法,使应用程序的开发者可以专注于应用程序的开发),但受限于不同部门沟通的成本问题,现阶段直接使用的价值不大. 一.视图(只能sel ...
- MySQL 索引原理相关文章
CSDN的整理: http://bbs.csdn.net/topics/392265880 引擎在磁盘中存储顺序的图解: http://blog.csdn.net/php_lzr/article/de ...
- 是armhf,还是armel?
本文译至:https://blogs.oracle.com/jtc/entry/is_it_armhf_or_armel ARM处理器有各种品牌和规格,其中一部分的原因涉及到市场问题,成本,大小和功耗 ...
- MYSQL事务处理失效原因
mysql有多种存储引擎,有些版本(mysql5.5.5以前默认是MyISAM,mysql5.5.5以后默认是InnoDB)安装时默认的存储引擎是MyISAM,而MyISAM存储引擎是不支持事务处理的 ...
- html跳转指定位置-利用锚点
比如我现在 a.html 的时候,我想跳转到 b.html ,并且是 b.html 的某一个位置,用 <a href=>, a.html里: <a href="b.html ...
- Confluence 6 PostgreSQL 设置准备
请查看 Supported Platforms 页面来获得 Confluence 系统支持的 PostgreSQL 数据库版本.你需要在安装 Confluence 之前升级你的 PostgreSQL ...
- Confluence 6 下载和安装 Oracle thin 驱动
基于许可证的考虑,我们不能将 Oracle 的驱动捆绑到 Confluence 中.如果你希望你的 Confluence 能够连接到 Oracle 数据库,你需要: 停止 Confluence. 进入 ...
- Confluence 6 包括从其他 Confluence 服务器上来的通知
Confluence workbox 可以显示从 Confluence 服务器上发送过来的消息. 让我们假设你有 2 个 Confluence 服务器, ConfluenceChatty 和 Conf ...
- 使用gulp-babel转换Es6出现exports is not defined 问题
//问题描述:当使用import导入模块时,出现exports is not defined //1.安装插件 npm install --save-dev babel-plugin-transfor ...