Python习题十二

6-1 jmu-python-组合数据类型-2.坐标点分类

在上题(1.计算坐标点欧氏距离)的基础上。将每个点根据距离原点的远近分成两类,一类是小于r的点,一类是大于等于r的点。

步骤如下:

  1. 调用ClassifyPoints(points, r)函数根据输入的半径r进行分类,将所有**<r的点放入a列表,>=r**的点放入b列表。然后将a,b列表以元组的方式返回赋值给pointsTuple
  2. pointsTuple直接输出。
  3. 调用printPointsTuple(pointsTuple, r),将**<r>=r**的点集合分情况输出,输出还需包含每个点集的平均距离。

函数接口定义:

readPoint() #从一行以,分隔的数中读取坐标,放入元组并返回。如果相应位置无数据,按0处理。
distance(point) #计算point与原点的距离并返回,要math库中的函数
ClassifyPoints(points, r): #根据r将points中的点分成两类放入两个列表,距离小于r与大于等于r。然后将两个列表以元组的形式返回
avgDistance(pointList): #计算列表pointList中的所有点到原点的平均距离,可利用distance(p)函数
printPointsTuple(psTuple, r): #将元组psTuple中的数据按照输出样例格式输出。输出顺序由psTuple中点列表的顺序决定。

裁判测试程序样例:

/* 请在这里填写答案 */
n = int(input())
r = int(input())
points = []
for i in range(n):
    p = readPoint()
    points.append(p)
    print('Point = {}, type = {}, distance = {:.3f}'.format(p,type(p),distance(p)))
    
pointsTuple = ClassifyPoints(points, r)
print("pointsTuple = {}".format(pointsTuple))
printPointsTuple(pointsTuple,r)

输入格式:

输入n,代表底下要输入n行点坐标。点坐标x,y,z以,分隔。坐标全部为整数。
输入r, 代表要以r作为分类依据。

注意: 坐标以,分隔,相应位置可能无字符或者包含多个空格字符,读入时按照0进行处理。

输出格式:

见输出样例。注意:= < >=两侧均有一个空格,,后面要有一个空格。
printPointsTuple中计算的平均距离保留3位小数。输出顺序由psTuple中点列表的顺序决定。

输入样例:

5
5
1,1,1
,,
2,3,5
3,1,3
5,,

输出样例:

Point = (1, 1, 1), type = <class 'tuple'>, distance = 1.732
Point = (0, 0, 0), type = <class 'tuple'>, distance = 0.000
Point = (2, 3, 5), type = <class 'tuple'>, distance = 6.164
Point = (3, 1, 3), type = <class 'tuple'>, distance = 4.359
Point = (5, 0, 0), type = <class 'tuple'>, distance = 5.000
pointsTuple = ([(1, 1, 1), (0, 0, 0), (3, 1, 3)], [(2, 3, 5), (5, 0, 0)])
distance < 5, avgDistance = 2.030, points = [(1, 1, 1), (0, 0, 0), (3, 1, 3)]
distance >= 5, avgDistance = 5.582, points = [(2, 3, 5), (5, 0, 0)]

代码长度限制 16 KB

时间限制 400 ms

内存限制 64 MB

参考答案

#方法一
def readPoint():
    n = list(input().split(','))
    while '' in n:
        n[n.index('')] = 0
    n = tuple(map(int, n))
    return tuple(n)
 
 
def distance(point):
    return (point[1] ** 2 + point[2] ** 2 + point[0] ** 2) ** 0.5
 
 
def ClassifyPoints(points, r):
    lis1, lis2 = [], []
    for i in points:
        if distance(i) >= r:
            lis2.append(i)
        else:
            lis1.append(i)
    lis = [lis1, lis2]
    return tuple(lis)

def avgDistance(pointList):
    sum1, n = 0, 0
    for i in pointList:
        sum1 += distance(i)
        n += 1
    return sum1 / n

def printPointsTuple(psTuple, r):
    p1, p2 = psTuple[0], psTuple[1]
    print('distance < {}, avgDistance = {:.3f}, points = {}'.format(r, avgDistance(p1), p1))
    print('distance >= {}, avgDistance = {:.3f}, points = {}'.format(r, avgDistance(p2), p2))
#方法二
import math

def readPoint():
    coord = input().split(',')
    t=tuple(map(int,['0'+i for i in coord]))
    return t

def distance(point):
    s = math.sqrt(pow(point[0],2) + pow(point[1],2) + pow(point[2],2))
    return s

def ClassifyPoints(points, r):
    ls1=[]
    ls2=[]
    for i in points:
        d = distance(i)
        if d < r:
            ls1.append(i)
        else:
            ls2.append(i)
    return ls1,ls2

def avgDistance(pointList):
    lst=[distance(i) for i in pointList]
    return sum(lst)/len(lst)

def printPointsTuple(psTuple, r):
    a = psTuple[0]
    b = psTuple[1]
    print('distance < {}, avgDistance = {:.3f}, points = {}'.format(r,avgDistance(a),a))
    print('distance >= {}, avgDistance = {:.3f}, points = {}'.format(r, avgDistance(b), b))

6-2 列表推导生成矩形

实现一个Python3函数,使用列表推导语法生成m行n列的矩阵(二维列表),每个元素的值等于行号+列号。
其中,行号,列号从1开始计数。

函数接口定义:

def generateMatrix (m,n)

m: 1<m<100, int, 表示行数;
n: 1<n<100, int, 表示列数。

裁判测试程序样例:

#测试程序
m = int(input())
n = int(input())
r = generateMatrix(m,n)
p = True
for i in range(m):
    for j in range(n):
        if r[i][j] != (i+j+2):
            p = False
            break

print(p)

#测试程序的正确输出:
True

测试程序输入样例:

3
8

测试程序输出样例:

True

代码长度限制 16 KB

时间限制 400 ms

内存限制 64 MB

参考答案

#方法一
def generateMatrix(m, n):
    lis, lis1 = [], []
    for i in range(m):
        for j in range(n):
            lis1.append(i + j + 2)
        lis.append(list(lis1))
        lis1.clear()
    return lis
#方法二
def generateMatrix (m,n):
    return [[x+y for y in range(1,n+1)] for x in range(1,m+1)]

6-3 求列表中和为n的整数对

本题要求实现一个函数pairSum(),带两个输入参数:一个值不重复的整数列表lst和一个整数n。输出列表中所有和为n的整数对的索引。

函数接口定义:

 pairSum(lst, n)

lst是传入的整数列表,n为整数

裁判测试程序样例:

#  请在这里填写答案 

def main():
    #输入一系列以逗号隔开的整数
    lst = list(map(int,input().split(",")))
        #输入一个整数
    n = int(input())
    pairSum(lst, n)

输入样例:

7,8,5,3,4,6
11

输出样例:

在这里给出相应的输出。例如:

0 4
1 3
2 5

代码长度限制 16 KB

时间限制 400 ms

内存限制 64 MB

参考答案

#方法一
def pairSum(lst, n):
    for i in range(len(lst) - 1):
        for q in range(i + 1, len(lst)):
            if lst[i] + lst[q] == n:
                print(i, q)
#方法二
from itertools import *
def pairSum(lst, n):      
    l=list(permutations(range(len(lst)),2))
    for i,j in l:
        if lst[i]+lst[j]==n and i<j:
            print(str(i)+" "+str(j))

6-4 求最大和子列表

本题要求实现一个函数msslst(),带一个整数列表作为输入参数。要求函数计算并返回输入列表中的最大和子列表之和。最大和子列表是输入列表的子列表(切片),其各项之和最大。所有列表项都为负数,则最大和子列表为空子列表,空子列表的和定义为0。

函数接口定义:

msslst(lst)

lst为传入的整数列表。

裁判测试程序样例:

 
# 请在这里填写答案 

def main():
    s = input()
    items = s.split()
    lst = [eval(x) for x in items]
    print(msslst(lst))

main()

输入样例1:

在这里给出一组输入。例如:

4 -2 -8 5 -2 7 7  2 -6 5

输出样例1:

在这里给出相应的输出。例如:

19

输入样例2:

在这里给出一组输入。例如:

3 4 5

输出样例2:

在这里给出相应的输出。例如:

12

输入样例3:

在这里给出一组输入。例如:

-2 -3 -5

输出样例3:

在这里给出相应的输出。例如:

0

参考答案

#方法一
def msslst(lst):
    max1 = 0
    lst_max = [0]
    for i in lst:
        max1 = max(max1 + i, i)
        lst_max.append(int(max1))
    return max(lst_max)
#方法二
from itertools import *
def msslst(lst):
    a=[1 for i in lst if i>0]
    if a:
        l=list(permutations(range(len(lst)),2))
        m=max([sum(lst[i:j+1]) for i,j in l])
        return m
    else:
        return 0

7-1 缩写期刊名

科研工作者经常要向不同的期刊投稿。但不同期刊的参考文献的格式往往各不相同。有些期刊要求参考文献所发表的期刊名必须采用缩写形式,否则直接拒稿。现对于给定的期刊名,要求按以下规则缩写:
(1)长度不超过4的单词不必缩写;
(2)长度超过4的单词仅取前4个字母,但其后要加“.”;
(3)所有字母都小写。

输入格式:

首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。
每组测试输入一个包含大小写字母和空格的字符串(长度不超过85),单词由若干字母构成,单词之间以一个空格间隔。

输出格式:

对于每组测试,在一行上输出缩写后的结果,单词之间以一个空格间隔。

输入样例:

2
Ad Hoc Networks
IEEE Transactions on Nanotechnology

输出样例:

ad hoc netw.
ieee tran. on nano.

代码长度限制 16 KB

时间限制 400 ms

内存限制 64 MB

参考答案

#方法一
n = int(input())
for i in range(n):
    lis = list(map(str, input().split()))
    for i in range(len(lis) - 1):
        if len(lis[i]) > 4:
            print(lis[i][:4].lower() + '.', end=' ')
        else:
            print(lis[i].lower(), end=' ')
    if len(lis[len(lis)-1]) > 4:
        print(lis[len(lis)-1][:4].lower() + '.')
    else:
        print(lis[len(lis)-1].lower())
#方法二
n=int(input())
for i in range(n):
    lst=input().split()
    for i in range(len(lst)):
        x=lst[i].lower()
        if len(x)>4:
            lst[i]=x[:4]+"."
        else:
            lst[i]=x
    print(*lst)

7-2 输出<=n的全部回文数

数字121从左往右读与从右往左读是一样的,这种数称为回文数。请使用for循环以及切片方法设计一个程序,
找出>=0并且<=n的全部回文数。

注意:单个的数字0,数字1,… 数字9也认为是回文数。

输入格式:

n

输出格式:

多行输出,一行一个数

输入样例:

13

输出样例:

0
1
2
3
4
5
6
7
8
9
11

代码长度限制 16 KB

时间限制 400 ms

内存限制 64 MB

参考答案

#方法一
def hui(n):
    l = len(n) // 2
    if len(n) % 2 == 0:
        if n[:l] == n[l:]:
            return True
        else:
            return False
    elif len(n) % 2 == 1:
        if n[:l] == n[l + 1:]:
            return True
        else:
            return False
 
 
n = int(input())
for i in range(n + 1):
    if hui(str(i)):
        print(i)
#方法二
n=int(input())
for i in range(0,n+1):
    if str(i)==str(i)[::-1]:
        print(i)

7-3 字典的应用-找出出现次数最多的字符串

编写一个程序,从键盘读取未指定个数的字符串,一行一个,以字符串"q"为输入结束标志("q"不列入统计范围)。使用字典找出其中出现次数最多的字符串,打印该字符串及其出现次数。

注意:本题的测试用例中将保证只有一个字符串出现次数最多。

输入格式:

字符串1

字符串2

字符串n

q

输出格式:

字符串 出现次数

输入样例:

abc
abc
bcd
xxx
q

输出样例:

abc 2

代码长度限制 16 KB

时间限制 400 ms

内存限制 64 MB

参考答案

#方法一
n = input()
lis = {}
while (n != 'q'):
    if n not in lis:
        lis[n] = 1
    else:
        lis[n] += 1
    n = input()
lis1 = sorted(lis.items(), key=lambda x: x[1], reverse=True)
print('{} {}'.format(lis1[0][0], lis1[0][1]))
#方法二
d={}
while True:
    s=input()
    if s=='q':
        break
    d[s]=d.get(s,0)+1
for k,v in d.items():
    if d[k]==max(d.values()):
        print(k,v)
        break

7-4 合并两个列表并去重

输入两个列表alist和blist,要求列表中的每个元素都为正整数且不超过10;
合并alist和blist,并将重复的元素去掉后输出一个新的列表clist。
可以使用以下实现列表alist的输入:
alist=list(map(int,input().split()))
同时为保证输出结果一致,请将集合内元素排序之后再输出。
如对于列表alist,可输出sorted(alist)。

输入格式:
共两行,每一行都用来输入列表中的元素值,以空格隔开(可能不至一个空格 )。

输出格式:
共一行,以列表形式打印输出。

输入样例:

在这里给出一组输入。例如:

1 2 3
4 3 2

输出样例:

在这里给出相应的输出。例如:

[1, 2, 3, 4]

代码长度限制 16 KB

时间限制 400 ms

内存限制 64 MB

参考答案

#方法一
alist = list(map(int, input().split()))
blist = list(map(int, input().split()))
lis = list(set(alist + blist))
print(sorted(lis))
#方法二
ls1=list(map(int,input().split()))
ls2=list(map(int,input().split()))
ls1+=ls2
print(sorted(set(ls1)))

7-5 奇偶数处理

这用户输入一系列整数,输入回车结束。将其中的奇数用 ‘+’ 连接输出,将其中偶数用 ‘-’ 连接输出。

输入格式:

每行输入一个正整数,输入回车结束输入

输出格式:

两行,第一行输出用’-‘连接的偶数,第二行输出用’+'连接的奇数。

输入样例:

在这里给出一组输入。例如:

25
34
14
13
36
59

输出样例:

在这里给出相应的输出。例如:

34-14-36
25+13+59

代码长度限制 16 KB

时间限制 400 ms

内存限制 64 MB

参考答案

#方法一
n = input()
lis1, lis2 = [], []
while n != '':
    if int(n) % 2 == 0:
        lis1.append(int(n))
    else:
        lis2.append(int(n))
    n = input()
for i in range(len(lis1) - 1):
    print(lis1[i], end='-')
print(lis1[len(lis1) - 1])
for i in range(len(lis2) - 1):
    print(lis2[i], end='+')
print(lis2[len(lis2) - 1])
#方法二
lst1=[]
lst2=[]

while True:
    n=input()
    if n=="":
        break
    elif int(n)%2==0:
        lst1.append(n)
    else:
        lst2.append(n)

print("-".join(lst1))
print("+".join(lst2))

7-6 集合A-B

求两个集合的差集。注意,同一个集合中不能有两个相同的元素。

输入格式:

首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试数据输入1行,每行数据的开始是2个整数n(0 < n ≤ 100)和m(0 < m ≤ 100),分别表示集合A和集合B的元素个数,然后紧跟着n+m个元素,前面n个元素属于集合A,其余的属于集合B。每两个元素之间以一个空格分隔。

输出格式:

针对每组测试数据输出一行数据,表示集合A-B的结果,如果结果为空集合,则输出“NULL”(引号不必输出),否则从小到大输出结果,每两个元素之间以一个空格分隔。

输入样例:

2
3 3 1 3 2 1 4 7
3 7 2 5 8 2 3 4 5 6 7 8

输出样例:

2 3
NULL

代码长度限制 16 KB

时间限制 400 ms

内存限制 64 MB

参考答案

#方法一
n = int(input())
for i in range(n):
    lis = list(map(int, input().split()))
    lis1, lis2 = lis[2: 2 + lis[0]], lis[2 + lis[0]:]
    lis3 = []
    for i in lis1:
        if i not in lis2:
            lis3.append(int(i))
    lis3.sort()
    if len(lis3) != 0:
        for i in range(len(lis3) - 1):
            print(lis3[i], end=' ')
        print(lis3[len(lis3) - 1])
    else:
        print('NULL')
#方法二
n=int(input())

for i in range(n):
    ls=list(map(int,input().split()))
    set1=set(ls[2:ls[0]+3])
    set2=set(ls[ls[0]+2:])
    ls=sorted(set1-set2)
    if ls:
        print(*ls)
    else:
        print("NULL")

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值