python练习1

1、自然数10以下的能被3或者5整除的有3,5,9,那么这些数字的和是23,求能被3或者5整除的1000以内数字的和

>>> print(sum([i for i in range(1,1000) if i%3==0 or i%5==0]))
233168

或者用reduce

>>> from functools import reduce
>>> print(reduce(lambda x,y:x+y, [i for i in range(1,1000) if i%3==0 or i%5==0]))
233168

2、在一个数组指定数组中移除指定数字,并返回新的住宿并从大到小排列,比如:nums=[1,6,6,3,6,2,10,2,100],remove_num=6,要求返回时 nums = [100,10,3,2,2,1]

>>> nums = [1, 6, 6, 3, 6, 2, 10, 2, 100]
>>> newnums = list(filter(lambda x:x!=6, nums))
>>> print(sorted(newnums,reverse=True))
[100, 10, 3, 2, 2, 1]

用内置的filter函数,速度快


3、从排序好的任意数组列表里面删除重复元素(你不知道列表里面有多少重复的元素),比如:nums=[1,3,3,5,5,8,10,10,100,100] ,处理完之后是 : [1,3,5,8,10,100]

>>> nums = [1, 3, 3, 5, 5, 8, 10, 10, 100, 100]
>>> print(sorted(set(nums)))
[1, 3, 5, 8, 10, 100]

使用set集合不重复的特性,将重复的元素删除,再通过sorted排序


4、从排序好的数组里面,删除重复的元素,重复的数字最多只能出现2次,比如:nums =[1,1,1,1,1,2,2,2,5] 要求返回 nums=[1,1,2,2,5]

from collections import Counter
if __name__=='__main__':
    def quest4(nums = [1, 1, 1, 1, 1, 2, 2, 2, 5], count=2):
        newnums = []
        print(Counter(nums))

        for k,v in Counter(nums).items():
            if v>count:
                for i in range(count):
                    newnums.append(k)
            else:
                for i in range(v):
                    newnums.append(k)
        print(nums)
        print(newnums)

    quest4()

Counter({1: 5, 2: 3, 5: 1})
[1, 1, 1, 1, 1, 2, 2, 2, 5]
[1, 1, 2, 2, 5]

collections是Python内建的一个集合模块,Counter是一个简单的计数器,例如,统计字符出现的个数


5、给定一个字符串,寻找没有字符串重复的最长的字符串,比如"bbbbb" 找到的是"b",长度为1; "abcabwbbd" ,找到的"cabw"

if __name__=='__main__':
    s1 = "abcabwbbd"
    
    def max_unique_str(s1=""):
        for i in range(len(s1)):
            contain = []
            contain.append(s1[i])
            for j in range(i+1,len(s1)):
                if s1[j] in contain:
                    yield contain
                    break
                else:
                    contain.append(s1[j])

    result = sorted([''.join(x) for x in max_unique_str(s1)], key=lambda x: len(x), reverse=True)[0]
    print('str:{}, len:{}'.format(result,len(result)))



str:cabw, len:4

6、有一串长的字符串 names="LI XIA ,ZHAO MING ,LAO WANG *,DA XIONG >,LI MEI MEI,CHANG JIANG,LI QIANG,ZHANG WU JI,ZHANG SAN FENG,DU GU QIU BAI,QIAO FENG"

要求:1)过滤出所有的名字,去掉每个名字的左右空格和乱码,每个名字的首字母大写,比如 'LAO WANG *',处理成'Lao wang';

           2)统计出所有名字里面名字最长的;

           3)统计出姓的人的名单;

from pprint import pprint
if __name__=='__main__':
    names = "LI XIA ,ZHAO MING ,LAO WANG *,DA XIONG >,LI MEI MEI,CHANG JIANG,LI QIANG,ZHANG WU JI,ZHANG SAN FENG,DU GU QIU BAI,QIAO FENG"

    def checkName(names):
        newnames = [name.title().strip(' *>') for name in names.split(',')]
        names_dict = {name:len(name) for name in newnames}
        result = sorted(names_dict.items(), key=lambda x:x[1], reverse=True)
        pprint(result)
        # print("名字最长的人:{}".format(result[0]))
        # pprint(sorted(names_dict.items(), key=lambda x:x[0].split(' ')[0]))

    checkName(names)



result:
[('Zhang San Feng', 14),
 ('Du Gu Qiu Bai', 13),
 ('Chang Jiang', 11),
 ('Zhang Wu Ji', 11),
 ('Li Mei Mei', 10),
 ('Zhao Ming', 9),
 ('Qiao Feng', 9),
 ('Lao Wang', 8),
 ('Da Xiong', 8),
 ('Li Qiang', 8),
 ('Li Xia', 6)]

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值