Python实验二

Posted 谭你一个脑瓜崩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python实验二相关的知识,希望对你有一定的参考价值。

程序片段编程题

1. 题库:把数列的元素重复n次,然后元素的平方形成新列表,然后去除重复元素
【问题描述】

读入一个整数列表和正整数n(n>1),把列表中每个元素重复n次,并对每个元素进行平方形成新的列表,最后去除列表中的重复元素。打印输出新列表。
【输入形式】

第一行输入列表,包括方括号,元素之间用逗号分隔。

第二行输入重复的次数。
【输出形式】

直接用print输出列表
【样例输入】

[2,3,4,5,5]

5

【样例输出】

[4, 9, 16, 25]

ls = eval(input())
n = eval(input())
# 重复列表元素n次
ls2=[];
for i in range(n):
    ls2+=ls
ls3 = [x*x for x in ls2]
# 下面代码去除重复元素
ls4=[]
for x in ls3:
   if not x in ls4:
           ls4.append(x)

print(ls4)

2. 题库:找出列表中的多数元素
【问题描述】

读入一个大小为n的列表,找出其中的多数元素。多数元素是指在列表中出现次数大于n//2的元素(每个列表最多一个多数元素)。根据代码框架编写一个函数。
【输入形式】

输入列表,包括方括号,逗号分隔
【输出形式】

如果有多数元素,输出这个元素的值,如果没有多数元素,输出False
【样例输入】

[3,2,3]
【样例输出】

3

def search(y):
    for x in y:
        if(y.count(x)>(len(y)//2)):
            return x;
    return False;

nums = eval(input())
y = search(nums)
print(y)

3. 题库:找出不是两个列表中的共有元素,在结果列表升序没有重复元素
【问题描述】

给定两个整型列表,找出不是两者共有的元素。这些元素不重复的放入新的列表,并升序排列。输出结果列表

【输入形式】

第一行输入一个列表,包括方括号,逗号分隔

第二行输入一个列表,包括方括号,逗号分隔
【输出形式】

直接用print打印结果列表
【样例输入】

[1,2,3,4,5,6,7,8,8,9,9]

[1,2,3,4,7,7,7,10,10]

【样例输出】

[5, 6, 8, 9, 10]

【样例说明】

在第一个列表中8,9有重复元素,在结果列表中只能有一个。第二个列表中的10也有重复元素,去除。升序排列元素。

nums1 = eval(input())
nums2 = eval(input())
nums3 = []
# 把不nums1中和nums2不重复的元素加入nums3
for x in nums1:
    if x not in nums2:
        if x not in nums3:
            nums3.append(x);

# 把num2中的元素不重复的加入nums3
for x in nums2:
    if x not in nums1:
        if x not in nums3:
            nums3.append(x)
# True为逆序,False为正序
nums3.sort(reverse = False)

print(nums3)

4. 题库:判断一个数的两个加数是否在列表中
【问题描述】

读入一个列表nums和整数n,判断构成n的两个加数是否在列表中。每个元素可以使用多次。如果存在,这输出True,不存在输出False。
【输入形式】

第一行输入列表,包括方括号,列表元素逗号分隔

第二行输入整数
【输出形式】

True或者False
【样例输入】

[1,2,2,3]

6
【样例输出】

True
【样例说明】

输入的样例中,6=3+3,所以结果输出为True

如果第二行输入的是7。则输出False

nums = eval(input())
n = eval(input())
for x in nums:
    if n-x in nums:
        print(True)
        break
else:
    print(False)

5. 题库:判断一个和的两个加数是否在列表中,每个元素不能使用2次(片段)。
【问题描述】

读入一个整数列表nums,读入一个整数sum。判断列表中是否有两个元素的和为sum。每个位置的元素只能使用一次。如果满足条件输出True,不满足输出False。
【输入形式】

第一行输入列表,包含方括号,逗号分隔

d第二行输入一个整数
【输出形式】

True或者False
【样例输入】

[1,2,3,4,5,6,6]

12

【样例输出】

True
【样例说明】

如果上面的输入列表中只有一个6,则不能构成和12. 因为每个元素只能使用一次。

nums = eval(input())
sum = eval(input())
for x in range(len(nums)):
    n = sum-nums[x]
    if n in nums:
        if n!=nums[x]:
            print(True)
            break
        else:
            if nums.count(n)>=2:
                print(True)
                break
else:
    print(False)

6. 题库:计算列表的度
【问题描述】

对于一个包含自然数的列表nums,计算他的度。列表的度定义为列表里任一元素出现的频率的最大值。

【输入形式】

从键盘输入一个列表,包含方括号,逗号分隔
【输出形式】

整数
【样例输入】

[1,2,3,3,4,5,4,3,3]

【样例输出】

4
【样例说明】

列的所有元素的频率中,元素3的频率最大为4.

def calDegrees(y):
    z=0;
    for x in y:
        if y.count(x)>z:
            z=y.count(x);
    return z;
        
nums = eval(input())
d=calDegrees(nums) #调用自定义函数
print(d)

编程题

1. 题库:计算整数列表平均值(根据结果判断是否输出小数部分)
【问题描述】

输入一个整数列表,计算所有元素的平均值,如果结果中小数为0,请只输出整数部分,如果结果中的小数部分不为0,则输出结果保留两位小数。
【输入形式】

从键盘输入列表,包含方括号,列表元素用逗号分隔。

【输出形式】

纯整数,或者带两位小数的浮点数
【样例输入1】

[1,2,3,4,5]
【样例输出1】

3

【样例输入2】

[2,2,3,7,5,1]
【样例输出2】

3.33

【样例说明】

[1,2,3,4,5]列表平均值为3,计算出来结果小数部分为0,只输出整数3;[2,2,3,7,5]列表平均值为浮点数,所以输出结果保留两位小数为3.33

import math
from statistics import mean
def pr(y):
    x = mean(y) 
    z=math.floor(x);
    if(x==z):
        print(z)
    else:
        print("%.2f" %x)

sums=eval(input());
pr(sums);

2. 题库:生成指定长度的等差数列
【问题描述】

输入三个正整数n,m,l,生成指定长度的等差数列,存入列表中。其中n表示起始值,m表示列表元素的数量,l表示公差。
【输入形式】

在同一行输入n,m,l三个值,中间用英文逗号分隔。
【输出形式】

打印输出列表
【样例输入】

2,3,2
【样例输出】

[2, 4, 6]

【样例说明】

第一个数字表示数列的起始值,第二个数字表示数据的个数,第三个数字表示差。

def shulie(n,m,l):
    sums = list(range(n,(n+m*l),l));
    print(sums);
x,y,z=eval(input());
shulie(x,y,z);

3. 题库: 把列表中数值为0的元素移动到列表的尾端,其他元素相对顺序不变。
【问题描述】

读入一个整数列表,把数值为0的元素移动到列表尾部,其他元素的相对顺序不变。输出调整后的列表。
【输入形式】

按照列表的形式输入,包括方块号,逗号分隔。
【输出形式】

直接使用print打印
【样例输入】

[1,0,2,0,3,0,4]

【样例输出】

[1, 2, 3, 4, 0, 0, 0]

def ling(y):
    z=[0];
    x=y.count(0);
    while 0 in y:
        y.remove(0);
    for i in range(x):
        y=y+z;
    print(y);
sums=eval(input());
ling(sums);

4. 题库:在列表中找出只出现一次的元素,并排序输出
【问题描述】

输入一个自然数列表,找出只出现一次的元素,并升序输出。如果没有只出现一次的元素,则输出False。
【输入形式】

输入包含自然数的列表,包括方括号,逗号分隔
【输出形式】

排序后的数字,每个数字之间用英文逗号分隔。或者False。
【样例输入1】

[1,2,3,5,2,3,4]
【样例输出1】

1,4,5

【样例输入2】

[9,9,9,12,12]
【样例输出2】

False

【样例说明】

[9,9,9,12,12]列表中,9出现3次,12出现2次,没有出现一次的元素,则输出False。

def one(y):
    x=[];
    for i in y:
        if y.count(i)==1:
            x.append(i);
    x.sort(reverse=False);
    if x==[]:
        print(False);
    else:
        print(*x,sep=',');
sums=eval(input());
one(sums);

5. 题库:从一个列表中取出第n个元素,并重复m次,放到末尾,然后输出列表
【问题描述】

输入一个整数列表和整数n(n可以是负数)和正整数m,从该列表中选择第n个元素,把该元素重复m次,然后放到列表的尾端,最后输出列表。如果输入的n值不在列表下标范围之内,则输出"error"
【输入形式】

输入时,第一行输入列表的元素,用英文逗号分隔。

第二行输入两个数字n和m,用英文逗号分隔。

【输出形式】

直接使用print输出列表
【样例输入1】

1,2,3,4,5

2,3
【样例输出1】

[1, 2, 3, 4, 5, 3, 3, 3]

【样例输入2】

1,2,3,4,5

5,3
【样例输出2】

error

【样例说明】

样例2中,输入的n值为5,但是列表的元素一共才5个,超出下标范围,输出error

import math
def mowei(y,n,m):
    if n!=math.floor(n):
        print('error');
    else:
        if n>=(-len(y)) and n<len(y):
            x=y[n];
            for i in range(m):
                y.append(x);
            print(y);
        else:
            print('error');   
            
sums=list(eval(input()));
n,m=eval(input());
mowei(sums,n,m);

6. 题库:交换列表中两个元素的值,并输出列表
【问题描述】

输入一个由字符串构成的列表和两个整数n和m(n和m在输入列表的下标范围以内),交换其中两个元素的值,打印输出交换后的列表。
【输入形式】

第一行输入由空格分隔的多个字符串

第二行输入两个整数n和m,表示元素的位置,两个数字之间用空格区分。
【输出形式】

直接使用print函数输出列表
【样例输入1】

hello world python is great

2 3
【样例输出1】

[‘hello’, ‘world’, ‘is’, ‘python’, ‘great’]

【样例输入2】

hello world python is great

-2 3
【样例输出2】

[‘hello’, ‘world’, ‘python’, ‘is’, ‘great’]

【样例说明】

多个字符串由空格区分,程序读入后,转变成列表,然后交换指定位置的元素,最后使用print直接输出列表。

def Change(y,m,n):
    y[m],y[n]=y[n],y[m];
    print(y);
sums=input();
m,n = list(map(int, input().strip().split()))
y=sums.split();
Change(y,m,n);

7. 题库:计算整数列表的平均值
【问题描述】

输入一个整数列表,计算所有元素的平均值。结果保留两位小数。输入数据用逗号分隔
【输入形式】

从键盘输入一个整数列表,包括方括号,元素逗号分隔
【输出形式】

输出所有元素的平均值,结果保留两位小数

【样例输入】

[1,2,3,4,5]

【样例输出】

3.00
【样例说明】

用列表的形式输入一串整数,然后计算平均值,输出3.00,结果保留了两位小数。

def pingjun(y):
    print("%.2f" %(sum(y)/len(y)));
sums=eval(input());
pingjun(sums);

8. 题库:找出自然数列表中的素数,并放入另外一个列表,然后输出找出的素数
【问题描述】

读入一个自然数构成的列表,找出其中的每一个素数,然后放入另外一个列表,并输出这个列表。
【输入形式】

按照列表的形式输入,包括方括号,元素之间用逗号分隔。
【输出形式】

直接用print输出列表
【样例输入】

[2,3,5,7,9,11,23]

【样例输出】

[2, 3, 5, 7, 11, 23]

【样例说明】

所有的输入数据在一行。所有的输出在一行。

def sushu(y):
    x=[];
    for i in y:
        if i>=2:
            for j in range(2,i,1):
                if i%j==0:
                    break;
            else:
                x.append(i);
    print(x);
sums=eval(input());
sushu(sums);

20192308王泽荣python实验二报告

20192308 2022-2022-2 《Python程序设计》实验二报告

课程:《Python程序设计》
班级: 1923
姓名: 王泽荣
学号:20192308
实验教师:王志强
实验日期:2022年3月31日
必修/选修: 公选课

1.实验内容

  • 设计并完成一个完整的应用程序,完成加减乘除模等运算,功能多多益善。

  • 考核基本语法、判定语句、循环语句、逻辑运算等知识点

2. 实验过程及结果

   #两数运算
   import re

def calculate(n1, n2, operator):

   \'\'\'
   :param n1: float
   :param n2: float
   :param operator: + - * /
   :return: float
   \'\'\'
   result = 0
   if operator == "+":
       result = n1 + n2
   if operator == "-":
       result = n1 - n2
   if operator == "*":
       result = n1 * n2
   if operator == "/":
       result = n1 / n2
   return result


# 判断是否是运算符,如果是返回True
def is_operator(e):
   \'\'\'
   :param e: str
   :return: bool
   \'\'\'
   opers = [\'+\', \'-\', \'*\', \'/\', \'(\', \')\']
   return True if e in opers else False


# 将算式处理成列表,解决横杠是负数还是减号的问题
def formula_format(formula):
   # 去掉算式中的空格
   formula = re.sub(\' \', \'\', formula)
   # 以 \'横杠数字\' 分割, 其中正则表达式:(\\-\\d+\\.?\\d*) 括号内:
   # \\- 表示匹配横杠开头; \\d+ 表示匹配数字1次或多次;\\.?表示匹配小数点0次或1次;\\d*表示匹配数字1次或多次。
   formula_list = [i for i in re.split(\'(\\-\\d+\\.?\\d*)\', formula) if i]

   # 最终的算式列表
   final_formula = []
   for item in formula_list:
       # 第一个是以横杠开头的数字(包括小数)final_formula。即第一个是负数,横杠就不是减号
       if len(final_formula) == 0 and re.search(\'^\\-\\d+\\.?\\d*$\', item):
           final_formula.append(item)
           continue

       if len(final_formula) > 0:
           # 如果final_formal最后一个元素是运算符[\'+\', \'-\', \'*\', \'/\', \'(\'], 则横杠数字不是负数
           if re.search(\'[\\+\\-\\*\\/\\(]$\', final_formula[-1]):
               final_formula.append(item)
               continue
       # 按照运算符分割开
       item_split = [i for i in re.split(\'([\\+\\-\\*\\/\\(\\)])\', item) if i]
       final_formula += item_split
   return final_formula


def decision(tail_op, now_op):
   \'\'\'
   :param tail_op: 运算符栈的最后一个运算符
   :param now_op: 从算式列表取出的当前运算符
   :return: 1 代表弹栈运算,0 代表弹运算符栈最后一个元素, -1 表示入栈
   \'\'\'
   # 定义4种运算符级别
   rate1 = [\'+\', \'-\']
   rate2 = [\'*\', \'/\']
   rate3 = [\'(\']
   rate4 = [\')\']

   if tail_op in rate1:
       if now_op in rate2 or now_op in rate3:
           # 说明连续两个运算优先级不一样,需要入栈
           return -1
       else:
           return 1

   elif tail_op in rate2:
       if now_op in rate3:
           return -1
       else:
           return 1

   elif tail_op in rate3:
       if now_op in rate4:
           return 0   # ( 遇上 ) 需要弹出 (,丢掉 )
       else:
           return -1  # 只要栈顶元素为(,当前元素不是)都应入栈。
   else:
       return -1


def final_calc(formula_list):
   num_stack = []       # 数字栈
   op_stack = []        # 运算符栈
   for e in formula_list:
       operator = is_operator(e)
       if not operator:
           # 压入数字栈
           # 字符串转换为符点数
           num_stack.append(float(e))
       else:
           # 如果是运算符
           while True:
               # 如果运算符栈等于0无条件入栈
               if len(op_stack) == 0:
                   op_stack.append(e)
                   break

               # decision 函数做决策
               tag = decision(op_stack[-1], e)
               if tag == -1:
                   # 如果是-1压入运算符栈进入下一次循环
                   op_stack.append(e)
                   break
               elif tag == 0:
                   # 如果是0弹出运算符栈内最后一个(, 丢掉当前),进入下一次循环
                   op_stack.pop()
                   break
               elif tag == 1:
                   # 如果是1弹出运算符栈内最后两个元素,弹出数字栈最后两位元素。
                   op = op_stack.pop()
                   num2 = num_stack.pop()
                   num1 = num_stack.pop()
                   # 执行计算
                   # 计算之后压入数字栈
                   num_stack.append(calculate(num1, num2, op))
   # 处理大循环结束后 数字栈和运算符栈中可能还有元素 的情况
   while len(op_stack) != 0:
       op = op_stack.pop()
       num2 = num_stack.pop()
       num1 = num_stack.pop()
       num_stack.append(calculate(num1, num2, op))

   return num_stack, op_stack

测试结果截图

3. 实验过程中遇到的问题和解决过程

  • 正则表达式 re的学习
  • 对于运算符的判断
  • 出入栈

其他(感悟、思考等)

本次实验主要是计算器的制作,在编写过程中我收获了许多,加深了自己对python语言的理解程序设计是一个严谨的学科,要求我们认真对待每一行代码,每一个概念。在编写的过程中,注意清晰的思路,明确自己的目的,自己在做什么。我会继续努力,不断学习,保持进步

以上是关于Python实验二的主要内容,如果未能解决你的问题,请参考以下文章

20192308王泽荣python实验二报告

Python程序设计实验报告二

Python程序设计实验报告二:顺序结构程序设计

20204225秦瑗蔚《python程序设计》实验二报告

Python程序设计实验报告二:顺序结构程序设计(验证性实验)

Python程序设计实验报告二:顺序结构程序设计(验证性实验)