博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python题目练习(二)
阅读量:4352 次
发布时间:2019-06-07

本文共 10427 字,大约阅读时间需要 34 分钟。

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 OrderedDictd = OrderedDictd = 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))
View Code
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,midl = [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))
View Code

 

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')))
View Code

 

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 = 1while j < 10:    i = 1    s = ''    while i <= j:        sum = i * j        s += '{} * {} = {}  '.format(i,j,sum)        i += 1    print(s)    j += 1
View Code

 

5.三级菜单(可显示下级菜单,按q退出,按b返回)

menu = {    '北京': {        '海淀': {            '五道口': {                'soho': {},                '网易': {},                'google': {}            },            '中关村': {                '爱奇艺': {},                '汽车之家': {},                'youku': {},            },            '上地': {                '百度': {},            },        },        '昌平': {            '沙河': {                '老男孩': {},                '北航': {},            },            '天通苑': {},            '回龙观': {},        },        '朝阳': {},        '东城': {},    },    '上海': {        '闵行': {            "人民广场": {                '炸鸡店': {}            }        }
View Code
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 Truefor 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
View Code

 

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 redef 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 expressexpress =  '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))
View Code
import redef 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 - ydef suansu(re_str):    ret = re.search('(?P
\d+\.?\d*)(?P
[*/])(?P
-?\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
\d+\.?\d*)(?P
[*/])(?P
-?\d+\.?\d*)', re_str) except AttributeError:pass ret = re.search('(?P
-?\d+\.?\d*)(?P
[+-])(?P
-?\d+\.?\d*)',re_str) try: while True: re_str = re_str.replace(ret.group(),str(math(ret.groupdict()))) ret = re.search('(?P
-?\d+\.?\d*)(?P
[+-])(?P
-?\d+\.?\d*)', re_str) except AttributeError:return re_strdef 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(' ','')))
View Code
1 import re 2 def math(dic): 3     if dic['mark'] == '*':return float(dic['x']) * float(dic['y']) 4     elif dic['mark'] == '/':return float(dic['x']) / float(dic['y']) 5     elif dic['mark'] == '+':return float(dic['x']) + float(dic['y']) 6     else:return float(dic['x']) - float(dic['y']) 7 def suansu(re_str): 8     while True: 9         ret = re.search('(?P
\d+\.?\d*)(?P
[*/])(?P
-?\d+\.?\d*)', re_str)10 if ret:11 re_str = re_str.replace(ret.group(),str(math(ret.groupdict())))12 if '++' in re_str:re_str = re_str.replace('++','+')13 if '--' in re_str:re_str = re_str.replace('--','+')14 else:break15 while True:16 ret = re.search('(?P
-?\d+\.?\d*)(?P
[+-])(?P
-?\d+\.?\d*)', re_str)17 if ret:re_str = re_str.replace(ret.group(), str(math(ret.groupdict())))18 else:return re_str19 def main(user_inp):20 while True:21 ret = re.search('\([^(]+?\)',user_inp)22 if ret:user_inp = user_inp.replace(ret.group(), suansu(ret.group().replace('(', '').replace(')', '')))23 else:return suansu(user_inp)24 while True:print(main(input('>>:').replace(' ','')))
View Code

 

8.请用python函数实现n次登陆功能

def login(n,i = 1):    name = input('请输入用户名:').strip()    pwd = input('请输入密码:').strip()    if name == 'alex' and pwd == '123':return '登陆成功'    elif i == n:return '您的账户已经被锁定'    else:        print('登陆失败,你还有%s次机会'%(n - i))        i += 1        return login(n,i)print(login(3))
View Code

 

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 = 0min = 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 = 0print(min)
View Code
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
View Code
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
View Code

 

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进行排序,再合并
方法三

 

转载于:https://www.cnblogs.com/Coufusion/p/7805879.html

你可能感兴趣的文章
Principal Component Analysis 主元分析
查看>>
JDBC原生态代码
查看>>
韩版可爱小碎花创意家居收纳挂袋
查看>>
计算机基础之硬件
查看>>
python操作mysql ------- SqlAchemy正传
查看>>
如何使用 JSP JSTL 显示/制作树(tree) 菜单
查看>>
12.5号
查看>>
lintcode-medium-Binary Tree Zigzag Level Order Traversal
查看>>
logrotate日志切割
查看>>
POJ-3253 Fence Repair 贪心
查看>>
Arraylist集合遍历输出
查看>>
java中的选择结构与循环结构
查看>>
无法将类型“ASP.login_aspx”转换为“System.Web.UI.WebControls.Login”
查看>>
[cocos2dx] lua注册回调到c++
查看>>
(treap)[bzoj3224][洛谷3369][cogs1829]Tyvj 1728 普通平衡树
查看>>
Linux下常用的shell命令记录
查看>>
HTTP 常用 Header 讲解
查看>>
linux分割字符串操作
查看>>
PHP学习2
查看>>
多实例Mysql配置
查看>>