python-Data Collections课后题

翻译:鉴于最初的陈述

显示评估以下每个序列表达式的结果:

解:(a)[2, 1, 3, 4, 'c', 'a', 'b']

(b)[2, 1, 3, 4, 2, 1, 3, 4, 2, 1, 3, 4, 'c', 'a', 'b', 'c', 'a', 'b']

(c)1

(d)[1,3]

(e)报错。原因:s1是个列表,s2[-1]等价于‘b’,是个字符串,都不是同一类,所以无法相加。

总结:

  1. 列表与字符串的区别:列表的成员可以是任何数据类型,而字符串中只能是字符;列表的成员可修改,而字符串不能修改。
  2. Python列表与其他语言中数组的区别:列表是动态的,而数组是定长的;列表元素可以是混合类型的,而数组元素是同类型的

比如:list1=[1,2]

list2=[3,"a"]

# print list1+list2 #相加:返回[1,2,3,"a"]

# print list1*2#相乘:返回[1,2,1,2]

# print list1[1]#索引:返回2

# print len(list1)#长度:返回2

# print list1[:1]#分段:返回[1]

# for i in list1: #迭代:返回1 2

#     print i

#print "a" in list2 #查找"a"是否在list2中,若在返回true,否则返回false

#以上的方法字符串中也有

#以下的方法是列表的专有方法

list=[1,2,3,4,"a"]

del list[0:2]   #删除列表中第0到2(不包括2)的元素

print list      #返回[3,4,"a"]

list.append(["a","s"])#追加,在list列表后追加一个元素

print list      #返回[3, 4, 'a', ['a', 's']]

list.sort()     #排序

print list      #返回[3, 4, ['a', 's'], 'a']

list.reverse()  #逆转

print list      #返回['a', ['a', 's'], 4, 3]

print list.index(4)#根据元素查找列表中该元素的第一个索引,即第一个位置。返回2

list.insert(1,"yyl")#在第1位置处插入"yyl":

print list      #返回['a', 'yyl', ['a', 's'], 4, 3]

print list.count("a") #list"a"的个数,返回1

list.remove(3)  #del是根据位置删除,list是根据元素删除

print list      #返回['a', 'yyl', ['a', 's'], 4]

print list.pop(1)#按索引取出成员。这个和list[1]的效果可不一样。虽然list[1]也是返回yyl,但list[1]对这个原先的list可没有什么影响,而list.pop(1),

list就没有了yyl这个元素,即有“移除的意思”

翻译:给定与上一个问题相同的初始语句,在执行以下每个语句后显示s1和s2的值。 独立地处理每个部分(即,假设s1和s2每次都以其原始值开始)。

解:(a)[1,3,4]          

(b)报错。原因:应先排序,再逆序,不能写成链式的。即:s1.sort() s1.reverse()

(c) [2, 1, 3, 4, [2]]

(d)报错。原因:s2.pop(s1.pop(2)) 中s1.pop(2)等价于3,s2.pop(3)是将第3个元素移除,而s2没有第3个元素,故报错。若改成s2.pop(s1.pop(1)),那么s1.pop(1)等价于1,s2.pop(1)是指将s2的第1个位置的元素移除,即此时的s2为[‘c’,’b’]

(e) ['c', 'a', 'd', 'b']

翻译:修改章节中的统计包,以便客户端程序在计算均值和/或标准差时具有更大的灵活性。 具体来说,重新设计库以具有以下功能:

mean(nums)返回nums中数字的平均值。

stdDev(nums)返回nums的标准偏差。

meanStdDev(nums)返回nums的均值和标准差。

解:pass

翻译:大多数语言都没有Python所具有的灵活的内置列表(数组)操作。 为以下每个Python操作编写算法,并通过在合适的函数中编写算法来测试算法。 例如,作为函数,reverse(myList)应该与myList.reverse()相同。 显然,您不能使用相应的Python方法来实现您的功能。

 

 

 

 

 

解:(a)def count(myList,x):

    ans=0

    for ch in myList:

        if(ch==x):

            ans+=1

    return ans

def main():

    list=['a','a','b',3,3]

    x='a'

    print count(list,x)

main()

(b) def isin(myList,x):

    for ch in myList:

        if(ch==x):

            return True

            break

        else:

            return False

def main():

    list=['a','a','b',3,3]

    x='a'

    print isin(list,x)

main()

(c) def index(myList,x):

    K=0

    for ch in myList:

        K+=1

        if(ch==x):

            break

    return K-1

def main():

    list = ['a', 'a', 'b', 3, 3]

    x=3

    print index(list,x)

main()

(d) def reverse(myList):

    newList=[]

    for ch in myList:

        newList.insert(0,ch)

    return newList

def main():

    list = ['a', 'a', 'b', 3, 3]

    print reverse(list)

main()

(e)其实就是冒泡排序

在冒泡排序中,第一个for循环代表的是数组中有多少个数需要和其他数进行比较。假如说有100个数,那么只需要有99个,故为len(myList)-1,若是len(myList),则会多执行一次而已,所以减不减1,影像不大;第二个for循环代表的是数组的每个元素进行比较的次数,故为len(myList)-1-j,为何要减1?因为假如有3个元素,第一个和第二个比,第二个和第三个比即可,若不减1,就会超出索引范围,报错。为何要减j?因为前面的冒泡排序法是从第一个元素开始逐个和后面的元素进行比较,所以每比较一轮,最大的数就会排到最后面,所以最后面的就不需要再比较了,如果不减j,结果不会出错,但是算法的复杂度就会增加,有时候可能是成倍地增加,所以要注意这一点。

def sort(myList):

    for j in range(len(myList)-1):

        for i in range(len(myList)-1-j):

            if(myList[i]>myList[i+1]):

                K=myList[i+1]

                myList[i+1]=myList[i]

                myList[i]=K

    return myList

def main():

    list = ['a', 'a', 'b', 3, 3]

    print sort(list)

main()

翻译:编写并测试一个函数shuffle(myList),它将列表变成一个随机顺序,就像洗牌一样。

解:解题思路:首先获取列表的长度,然后在长度范围内使用randrange()随机生成一个数作为位置,然后判断随机生成的位置是否与当前的位置相同,若不同,则逐个将列表中的元素与该随机生成的位置的元素进行互换。

from random import *

def shuffle(myList):

    for i in range(len(myList)):

        K=randrange(len(myList))

        if (K!=i):

            tem=myList[i]

            myList[i]=myList[K]

            myList[K]=tem

    return myList

def main():

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

    print shuffle(list)

main()

翻译:Eratosthenes的Sieve是一种优雅的算法,用于查找所有素数达到某个极限n。 基本思想是首先创建一个从2到n的数字列表。 第一个数字从列表中删除,并作为素数公布,并且从列表中删除该数字的所有倍数n。 此过程将继续,直到列表为空。

例如,如果我们希望找到最多10个所有素数,那么该列表最初将包含2,3,4,5,6,7,8,9,10。2被删除并宣布为素数。 然后移除4,6,8和10,因为它们是2的倍数。它留下3,5,7,9。重复该过程,3被宣布为素数并被移除,并且9被移除,因为它是倍3的倍数。留下5和7。算法继续宣布5是素数并将其从列表中删除。 最后,7被宣布并删除,我们完成了。

编写一个程序,提示用户输入n,然后使用筛选算法查找小于或等于n的所有素数。

 

解:def main():

    #首先定义一个空列表用来存放素数

    newList=[]

    #输入n

    n=input("请输入n的值:")

    #通过输入的n生成一个列表

    list=range(2,n+1)

    #当这个原来的列表不为空的情况下就一直执行。(这个时候就显示出了whie比for的优势了)

    while(list!=[]):

        #首先删除列表的第0个元素,即素数,并赋值给k

        k=list.pop(0)

        #在定义的空列表里插入素数k

        newList.append(k)

        #遍历列表的其他元素,若能够被这个素数整除,则移除

        for num in list:

            if(num%k==0):

                list.remove(num)

    #打印出新的列表(里面都是素数)

    print newList

main()

注意:列表中list.pop()list.remove()del list[]都有移除的功能,它们的区别如下:

remove是删除首个符号条件的元素,并不是删除特定的索引。

del是根据索引(元素所在的位置,可以是多个,比如del list[0:3])来删除的。

pop是用来弹出该位置的元素,并将该元素删除。比如说a=list.pop(0)就类似于a=list[0] del list[0]。即先取后删。

需要注意的是:del是python语句,而不是列表方法。

翻译:创建并测试Set类以表示经典集。 您的集应支持以下方法:

解:pass

注:python文中的所有代码在粘贴进webStorm进行调试的时候会报错,原因是本文档的所有注释都是中文,所以在代码前需加上#-*-coding=UTF-8-*

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值