课上练习

习题1. 任意给定一个集合,按照包含元素数量从小到大,列出该集合的所有真子集

"""
结题思路,以包含3个元素的集合{"a", "b", "c"}为例
一个集合中的元素数量为N,那么其包含子集的数量为2^N
包含0个元素
            □ □ □          000   包含0个1
包含1个元素
            □   □   "c"     001   包含1个1
            □   "b"  □      010
            "a"  □   □      100
包含2个元素
            □   "b"  "c"     011   包含2个1
            "a"  "b"  □      110
            "a"  □   "c"     101
包含3个元素
            "a"  "b"  "c"     111  包含3个1
"""

SpecialSet = {"a", "b", "c", "d", "e"}
N = len(SpecialSet)
SpecialList = list(SpecialSet)

# 按照集合包含元素数量遍历
for ElementNum in range(N+1):
    print("含有", ElementNum, "个元素的子集")
    for Index in range(2**N):

        IndexBinStr = str(bin(Index))  # 将Index转换为二进制数字
        IndexBinStr = IndexBinStr.replace("0b", "")   # 去掉二进制数前面的0b
        IndexBinStr = str("0")*(N - len(IndexBinStr)) + IndexBinStr   # 前面补0 , 形成一个N位的二进制
        """
        求解其中1的个数,判断是否与子集元素个数相等
        """
        if len(IndexBinStr.replace("0", "")) == ElementNum:
            # 根据IndexBunStr的位置判断入选元素
            subset = {SpecialList[Index] for Index in range(0, len(SpecialList)) if IndexBinStr[Index] == '1'}

            print(subset)

习题2. 求出1~10000中所有由且仅由3,6,9三个数字构成的数之和。
说明:
693、3396、963都是由且仅由3、6、9三个数字构成,符合要求;
1235、968不是全由3、6、9三个数字构成,不符合要求;
669不包含数字3,不符合要求。

Sum = 0
SpecialSet = {'3', '6', '9'}
for num in range(0, 10001):
	Set = set(str(num))
	if Set == SpecialSet:
		Sum += num
	else:
		continue
print(Sum)


Out:
243972

习题3. 求出1~10000中所有由3或6或9三个数字构成的数之和。
说明:
3、33、396、96、999都是由3或6或9三个数字构成的数。

Sum = 0
Set1 = {"3", "6", "9"}
for num in range(1, 10001):
    Set = set(str(num))

    if Set <= Set1:
                    Sum += num
    else:
        continue
print(Sum)

Out:
558540

习题4. 求出1~10000中所有不包含3或6或9三个数字构成的数之和。
说明:
17、25、587不包含3或6或9三个数字构成的数,符合要求;
17、25、587不包含3或6或9三个数字构成的数,不符合要求。

Sum = 0
Set1 = {"3", "6", "9"}
for num in range(1, 10001):
    Set = set(str(num))

    if Set & Set1 == set():
                    Sum += num
    else:
        continue
print(Sum)

Out:
10298971

习题5. 对于给定的整数列表,例如[12,32,43,12,33,90,100,32],生成一个字典,字典中包含两项:一项是由列表中大于40的元素组成的列表,另一项是由列表中小于40的元素组成的列表,保持原列表中元素的先后顺序不变。

"""
注意等于40的情况
"""
List = [12, 32, 43, 12, 33, 90, 100, 32]
NewList1 = []
NewList2 = []
for ii in List:
    if ii<40:
        NewList1.append(ii)
    elif ii>40:
        NewList2.append(ii)
    else:
        continue
Dict1 = {"More": NewList1}
Dict2 = {"Less": NewList2}
print(Dict1)
print(Dict2)

Out:
{'More': [12, 32, 12, 33, 32]}
{'Less': [43, 90, 100]}

习题6. 任意给定一个字符串:
1)判断该字符串是否为纯英文字符构成;
2)判断该字符串是否为纯小写英文字符构成;
3)判断该字符串是否为纯大写英文字符构成;
4)判断该字符串中包含多少个不同英文字母(大小写不同);
5)判断该字符串中包含多少个不同小写英文字母;
6)判断该字符串中包含多少个不同大写英文字母;
说明:
“abcbcDEDE66”
不是纯英文字母构成、不是纯小写英文字母构成、不是纯大写英文字母构成
包含5个字母:a,b,c,D,E
包含3个小写字母:a,b,c
包含2个大写字母:D,E

String = "abcbcDEDE66"
StringSet = set(String)

# 小写字母的ASCII码97(a)~122(z)
LetterSetLowerSet = {chr(ASCIINumber) for ASCIINumber in range(97, 122+1)}
"""
chr() 用一个范围在 range(256)内的(就是0~255)整数作参数,返回一个对应的字符。
chr(48).chr(49),chr(97)对应0 1 a
"""
# 大写字母的ASCII码65(A)~90(Z)
LetterSetCapital = {chr(ASCIINumber) for ASCIINumber in range(65, 90+1)}
# 大小写字母集合 并集
LetterSet = LetterSetLowerSet | LetterSetCapital

# 判断该字符串是否为纯英文字母构成
if StringSet <= LetterSet:
    print("给出的字符是全部都由字母组成")
else:
    print("给出的字符不是都由纯字母组成")

# 判断该字符串是否全部由小写字母组成
if StringSet <= LetterSetLowerSet:
    print("给出的字符串是由纯小写字母组成")
else:
    print("给出的字符串不是由纯小写字母组成")

# 判断该字符串是否全部由大写字母组成
if StringSet <= LetterSetCapital:
    print("给出的字符串是由纯大写字母组成")
else:
    print("给出的字符串不是由纯大写字母组成")

# 给出该字符串包含多少个不同小写字母
print("给出的字符串中小写字母的数量",\
      len(StringSet & LetterSetLowerSet))

# 给出该字符串包含多少个不同大写字母
print("给出的字符串中大写字母的数量",\
      len(StringSet & LetterSetCapital))

Out:

给出的字符不是都由纯字母组成
给出的字符串不是由纯小写字母组成
给出的字符串不是由纯大写字母组成
给出的字符串中小写字母的数量 3
给出的字符串中大写字母的数量 2

习题7. 求出1~10000所有回文数的和。
说明:
所谓回文数指的是2332,121,33,555,6666,这种从左读和从右读完全一样的数。

Sum = 0
for i in range(1, 10000):
    CharI = str(i)
    if CharI == CharI[::-1]:
        Sum += i
print(Sum)

Out
545040

习题8. 生成一个列表X,X中的元素由1~1000中所有包含数字3或3的倍数组成,即[3,6,9,12,13……],并且删除列表中索引为0,5,10,15,20,25,……的元素。

# 方法一
x = [i for i in range(1, 1000) if ('3' in str(i)) or (i % 3 == 0)]
print(x)

# 方法二
x = [i for i in range(1, 1000) if ('3' in str(i)) or (i % 3 == 0)]   
for Index in range(len(x), 0-1, -1):  # 注意:删除元素后,元素的索引发生变化
    if 0 == Index % 5:
        x.pop(Index)
print(x)

习题9. 求出所有水仙数的和。水仙数是指一个三位数,其各位数立方和等于该数。

Sum = 0
for i in range(100, 1000):
    StrI = str(i)
    if int(StrI[0]) ** 3 + int(StrI[1]) ** 3 + int(StrI[2]) ** 3 == i:
        Sum += i
print(Sum)

Out:
1301

习题10. 有1,2,3,4个数字,能组成多少个互不相同且无重复数字的三位数,都是多少?

Num = 0
for x in range(1, 5):
    for y in range(1, 5):
        for z in range(1, 5):
            if (x != y) and (y != z) and (x != z):
                Num += 1
                print("{0}{1}{2}" .format(x, y, z))
print("Num=", Num)

习题11. 判断101-200之间有多少个素数,并输出所有素数。

for i in range(101, 201):
    for j in range(2, i):
        if (0 == i % j):
            break
    else:
            print(i)

习题12. 一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程找出1000以内的所有完数

for i in range(1, 1000):
    sum = 0
    for j in range(1, i):
        if 0 == i % j:
            sum += j
    if i == sum:
        print(i)

习题13. 求编写函数解以下所有数之和,其中n为拥护指定的函数的输入参数
1
1、2
1、2、3
1、2、3、4
……
1、2、3、4、……、5

def getSum():
    ListNum = []
    n = int(input("Please enter the number: "))
    Sum = 0

    for i in range(1, n + 1):
        for j in range(i - 1, 0, -1):
            Sum2 = i + j
            ListNum.append(Sum2)
            Sum += Sum2
    return Sum

Out:

print(getSum())
Please enter the number: 5
60

习题14. 对于给定字典列表,请按照得分score从大到小的顺序,重新排列该列表,并挑选出score为63的字典
StudentList = [{“name”: “Tom”, “age”: 22, “score”: 63},
{“name”: “Jerry”, “age”: 45, “score”: 32},
{“name”: “Lucy”, “age”: 21, “score”: 85},
{“name”: “Tony”, “age”: 51, “score”: 65},
{“name”: “Bool”, “age”: 12, “score”: 97}]

StudentList = [{"name": "Tom", "age": 22, "score": 63},
               {"name": "Jerry", "age": 45, "score": 32},
               {"name": "Lucy", "age": 21, "score": 85},
               {"name": "Tony", "age": 51, "score": 65},
               {"name": "Bool", "age": 12, "score": 97}]

# 方法一 定义函数
def takeSecond(elem):
    return elem["score"]


StudentList.sort(key=takeSecond, reverse=False)
print(StudentList)

# 方法二 匿名函数
StudentList.sort(key=lambda x: x["score"], reverse=False)
print(StudentList)

Out:

[{'age': 45, 'name': 'Jerry', 'score': 32}, {'age': 22, 'name': 'Tom', 'score': 63}, {'age': 51, 'name': 'Tony', 'score': 65}, {'age': 21, 'name': 'Lucy', 'score': 85}, {'age': 12, 'name': 'Bool', 'score': 97}]
[{'age': 22, 'name': 'Tom', 'score': 63}]

习题15.对于给定的正整数,判断其是否为质数

def isPrime(n):
    for i in range(2, n//2):
        if n % i == 0:
            PrimeNum = False
            break
        else:
            PrimeNum = True
    return PrimeNum

习题16. 给定一个字符串和一个整数size,请把大小为size的左半区整体移到右半区,右半区整体移到左边。
例如:
字符串为“abcdefg”,size = 3
结果为“defgabc”

String = "abcdefg"
Size = 3
StringNew = String[int(Size):int(len(String))]+String[0:Size]
print(StringNew)

习题17. 给定一个字符串,其中只含有字母字符和*字符现在想把“*”全部挪到字符串的左边,字母字符移到右边
说明
“offer” 结果 “****offer”

String = "o*f*f*e*r"
print("*"*String.count("*") + String.replace("*","")

习题18. 给定一个整数(存储长度为32bit),求出该整数补码形式中包含1的数量

"""
计算机中,数值以二进制的补码形式保存
正数的原码=反码=补码
负数的补码=原码取反+1
计算中显示的数值和实际存储的数值不同
"""
NumDec = -36
Num = (str(bin(NumDec & 0xFFFFFFFF)).replace("0b", "")).count("1")
print(Num)

Out:

29

解析:
bin(NumDec & 0xFFFFFFFF)
>>> '0b11111111111111111111111111011100'
与上0xFFFFFFFF是为了让其显示在计算机中真正存储的数

习题19. 给定一个正整数n,对于1≤x≤n的所有正整数x,打印出所有满足以下要求的所有正整数:
x对应的二进制形式中,在0的左边知道包含一个1。

例如 n = 2
十进制 二进制 是否满足
1 1 不满足
2 10 满足
3 11 不满足
4 100 满足
5 101 满足
6 110 满足

n = 36
for i in range(1, n + 1):
    iBinStr = str(bin(i))
    if "10" in iBinStr.replace("0b", ""):
        print(i)
    else:
        continue

习题20. 编写一个函数,输入为正整数n,该函数求出不超过n的所有奇数之和

def oddSum(n):
    if n <= 0:
        return
    else:
        return sum([i for i in range(1, n + 1) if i % 2 == 1])

习题21. 对于一个由正整数构成的列表,列表中的元素均为3位数,将列表中的元素按照十位数的大小,从小到大顺序重新排列
例如 NumberList = [812, 312, 812, 999, 231, 721, 900, 800]的排序结果为[800,900,312,812,812,721,231,999]

def getSecond(n):
    nStrSecond = str(n)[1]
    return nStrSecond


NumberList = [812, 312, 812, 999, 231, 721, 900, 800]
NumberList.sort(reverse=False)  # 先将大小简单排序
NumberList.sort(key=getSecond, reverse=False)
print(NumberList)

习题22. 对于一个给定字符串构成的列表,字符串均为纯英文字幕组成(包含大小写)将该字符串按照首字母顺序排序(字母升序),
1)对于首字母相同的字符串,按照包含字母数量由少到多排列
2)对于首字母相同的字符串,按照包含字母数量由多到少排列
如果首字母相同,包含字母顺序也相同,则按照一般字母顺序比较。

NameList = [“Jom”, “Tom”, “Jack”, “Tony”, “Chery”, “Lucy”, “jim”, “Lily”, “jomy”]

NameList = ["Jom", "Tom", "Jack", "Tony", "Chery", "Lucy", "jim", "Lily", "jomy"]
NameList.sort()  # 先按首字母排序 ['Chery', 'Jack', 'Jom', 'Lily', 'Lucy', 'Tom', 'Tony', 'jim', 'jomy']


def paixv1(str):
    con1 = ord(str[0]) * 1000000  # 确保距离每一个字母之间距离拉开
    con2 = len(str)
    return con1 + con2


def paixv2(str):
    con1 = ord(str[0]) * 1000000
    con2 = 10000 - len(str)  # 避免从某一个ASCII值后往前数
    return con1 + con2


NameList1 = sorted(NameList, key=paixv1, reverse=False)
NameList2 = sorted(NameList, key=paixv2, reverse=False)

print(NameList1)
print(NameList2)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值