Python基础练习100题 ( 11

发布时间:2019-09-24 17:33:42编辑:auto阅读(1768)

    刷题继续

    上一期和大家分享了前10道题,今天继续来刷11~20

    Question 11:

    Write a program which accepts a sequence of comma separated 4 digit binary numbers as its input and then check whether they are divisible by 5 or not. The numbers that are divisible by 5 are to be printed in a comma separated sequence.

    Example:

    0100,0011,1010,1001
    Then the output should be:
    1010
    Notes: Assume the data is input by console.

    解法一

    def check(x):                   # check function returns true if divisible by 5
        return int(x,2)%5 == 0      # int(x,b) takes x as string and b as base from which
                                    # it will be converted to decimal
    data = input().split(',')
    
    data = list(filter(check,data)) # in filter(func,object) function, elements are picked from 'data' if found True by 'check' function
    print(",".join(data))

    解法二

    value = []
    items=[int(x) for x in input().split(',')]
    result = " ".join(str(x) for x in items if x %5==0 )
    print(",".join(result))

    解法三

    data = input().split(',')
    data = list(filter(lambda i:int(i,2)%5==0,data))   
    print(",".join(data))

    Question 12:

    Write a program, which will find all such numbers between 1000 and 3000 (both included) such that each digit of the number is an even number.The numbers obtained should be printed in a comma-separated sequence on a single line.

    解法一

    values = []
    for i in range(1000, 3001):
        s = str(i)
        if (int(s[0])%2==0) and (int(s[1])%2==0) and (int(s[2])%2==0) and (int(s[3])%2==0):
            values.append(s)
    print (",".join(values))
    

    解法二

    lst = []
    
    for i in range(1000,3001):
        flag = 1
        for j in str(i):          # every integer number i is converted into string
            if ord(j)%2 != 0:     # ord returns ASCII value and j is every digit of i
                flag = 0          # flag becomes zero if any odd digit found
        if flag == 1:
            lst.append(str(i))    # i is stored in list as string
    
    print(",".join(lst))  
    

    解法三

    def check(element):
        return all(ord(i)%2 == 0 for i in element)  # all returns True if all digits i is even in element
    
    lst = [str(i) for i in range(1000,3001)]        # creates list of all given numbers with string data type
    lst = list(filter(check,lst))                   # filter removes element from list if check condition fails
    print(",".join(lst))
    

    解法四

    lst = [str(i) for i in range(1000,3001)]
    lst = list(filter(lambda i:all(ord(j)%2 == 0 for j in i),lst ))   # using lambda to define function inside filter function
    print(",".join(lst))
    

    Question 13:

    Write a program that accepts a sentence and calculate the number of letters and digits.

    Suppose the following input is supplied to the program:

    hello world! 123
    Then, the output should be:
    LETTERS 10
    DIGITS 3

    解法一

    text_input = input()
    
    d={"DIGITS":0, "LETTERS":0,'SPACE':0}
    d['DIGITS']= sum(c.isdigit() for c in text_input)
    d['LETTERS']= sum(c.isalpha() for c in text_input)
    d['SPACE']  = sum(c.isspace() for c in text_input)
    
    for k,v in d.items():
        print(k,v)
    

    解法二

    word = input()
    letter,digit = 0,0
    
    for i in word:
        if ('a'<=i and i<='z') or ('A'<=i and i<='Z'):
            letter+=1
        if '0'<=i and i<='9':
            digit+=1
    
    print("LETTERS {0}\nDIGITS {1}".format(letter,digit))
    

    解法三

    word = input()
    letter,digit = 0,0
    
    for i in word:
        letter+=i.isalpha()         # returns True if alphabet
        digit+=i.isnumeric()        # returns True if numeric
    
    print("LETTERS %d\nDIGITS %d"%(letter,digit))       # two different types of formating method is shown in both solution
    

    Question 14:

    Write a program that accepts a sentence and calculate the number of upper case letters and lower case letters.

    Suppose the following input is supplied to the program:

    Hello world!
    Then, the output should be:
    UPPER CASE 1
    LOWER CASE 9

    解法一

    word = input()
    upper,lower = 0,0
    
    for i in word:
        if 'a'<=i and i<='z' :
            lower+=1
        if 'A'<=i and i<='Z':
            upper+=1
    
    print("UPPER CASE {0}\nLOWER CASE {1}".format(upper,lower))

    解法二

    
    
    text_input = input()
    d={"UPPER CASE":0, "LOWER CASE":0}
    for c in text_input:
        if c.isupper():
            d["UPPER CASE"]+=1
        elif c.islower():
            d["LOWER CASE"]+=1
        else:
            pass
    print ("UPPER CASE", d["UPPER CASE"])
    print ("LOWER CASE", d["LOWER CASE"])
    
    

    解法三

    
    word = input()
    upper = sum(1 for i in word if i.isupper())         
    lower = sum(1 for i in word if i.islower())
    
    print("UPPER CASE {0}\nLOWER CASE {1}".format(upper,lower))

    Question 15:

    Write a program that computes the value of a+aa+aaa+aaaa with a given digit as the value of a.

    Suppose the following input is supplied to the program:

    9
    Then, the output should be:
    11106

    解法一

    a = input()
    total,tmp = 0,str()        # initialing an integer and empty string
    
    for i in range(4):
        tmp+=a               # concatenating 'a' to 'tmp'
        total+=int(tmp)      # converting string type to integer type
    
    print(total)
    

    解法二

    a = input()
    total = int(a) + int(2*a) + int(3*a) + int(4*a)  # N*a=Na, for example  a="23", 2*a="2323",3*a="232323"
    print(total)
    

    Question 16:

    Use a list comprehension to square each odd number in a list. The list is input by a sequence of comma-separated numbers.
    Suppose the following input is supplied to the program:
    1,2,3,4,5,6,7,8,9
    Then, the output should be:
    1,3,5,7,9

    解法一

    values = input()
    numbers = [x for x in values.split(",") if int(x)%2!=0]
    print (",".join(numbers))
    

    Question 17:

    Write a program that computes the net amount of a bank account based a transaction log from console input. The transaction log format is shown as following:
    D 100
    W 200
    • D means deposit while W means withdrawal.
    Suppose the following input is supplied to the program:
    D 300
    D 300
    W 200
    D 100
    Then, the output should be:
    500

    解法一

    
    
    netAmount = 0
    while True:
        s = input()
        if not s:
            break
        values = s.split(" ")
        operation = values[0]
        amount = int(values[1])
        if operation=="D":
            netAmount+=amount
        elif operation=="W":
            netAmount-=amount
        else:
            pass
    print(netAmount)
    
    

    解法二

    total = 0
    while True:
        s = input().split()
        if not s:            # break if the string is empty
            break
        cm,num = map(str,s)  
    
        if cm=='D':
            total+=int(num)
        if cm=='W':
            total-=int(num)
    
    print(total)

    Question 18:

    A website requires the users to input username and password to register. Write a program to check the validity of password input by users.

    Following are the criteria for checking the password:

    • At least 1 letter between [a-z]
    • At least 1 number between [0-9]
    • At least 1 letter between [A-Z]
    • At least 1 character from [$#@]
    • Minimum length of transaction password: 6
    • Maximum length of transaction password: 12
    Your program should accept a sequence of comma separated passwords and will check them according to the above criteria. Passwords that match the criteria are to be printed, each separated by a comma.

    Example

    If the following passwords are given as input to the program:

    ABd1234@1,a F1#,2w3E*,2We3345
    Then, the output of the program should be:
    ABd1234@1

    解法一

    import re
    
    value = []
    items=[x for x in input().split(',')]
    for p in items: 
        if (len(p)<6 or len(p)>12):
            break
        elif not re.search("[a-z]",p):
            break
        elif not re.search("[0-9]",p):
            break
        elif not re.search("[A-Z]",p):
            break
        elif not re.search("[$#@]",p):
            break
        elif re.search("\s",p):
            break
        else:
            value.append(p)
            break
    
    print (",".join(value))

    解法二

    def is_low(x):       # Returns True  if the string has a lowercase
        for i in x:
            if 'a'<=i and i<='z':
                return True
        return  False
    
    def is_up(x):       # Returns True  if the string has a uppercase
        for i in x:
            if 'A'<= i and i<='Z':
                return True
        return  False
    
    def is_num(x):          # Returns True  if the string has a numeric digit
        for i in x:
            if '0'<=i and i<='9':
                return True
        return  False
    
    def is_other(x):       # Returns True if the string has any "$#@"
        for i in x:
            if i=='$' or i=='#' or i=='@':
                return True
        return False
    
    s = input().split(',')            
    lst = []
    
    for i in s:
        length = len(i)
        if 6 <= length and length <= 12 and is_low(i) and is_up(i) and is_num(i) and is_other(i):   #Checks if all the requirments are fulfilled
            lst.append(i)
    
    print(",".join(lst))
    
    

    解法三

    def check(x):
        cnt = (6<=len(x) and len(x)<=12)
        for i in x:
            if i.isupper():
                cnt+=1
                break
        for i in x:
            if i.islower():
                cnt+=1
                break
        for i in x:
            if i.isnumeric():
                cnt+=1
                break
        for i in x:
            if i=='@' or i=='#'or i=='$':
                cnt+=1
                break
        return cnt == 5               # counting if total 5 all conditions are fulfilled then returns True
    
    s = input().split(',')
    lst = filter(check,s)             # Filter function pick the words from s, those returns True by check() function
    print(",".join(lst))
    
    

    解法四

    import  re
    
    s = input().split(',')
    lst = []
    
    for i in s:
        cnt = 0
        cnt+=(6<=len(i) and len(i)<=12)
        cnt+=bool(re.search("[a-z]",i))      # here re module includes a function re.search() which returns the object information
        cnt+=bool(re.search("[A-Z]",i))      # of where the pattern string i is matched with any of the [a-z]/[A-z]/[0=9]/[@#$] characters
        cnt+=bool(re.search("[0-9]",i))      # if not a single match found then returns NONE which converts to False in boolean
        cnt+=bool(re.search("[@#$]",i))      # expression otherwise True if found any.
        if cnt == 5:
            lst.append(i)
    
    print(",".join(lst))
    
    

    Question 19:

    You are required to write a program to sort the (name, age, score) tuples by ascending order where name is string, age and score are numbers. The tuples are input by console. The sort criteria is:
    • 1: Sort based on name
    • 2: Then sort based on age
    • 3: Then sort by score
    The priority is that name > age > score.

    If the following tuples are given as input to the program:

    Tom,19,80
    John,20,90
    Jony,17,91
    Jony,17,93
    Json,21,85
    Then, the output of the program should be:
    [('John', '20', '90'), ('Jony', '17', '91'), ('Jony', '17', '93'), ('Json', '21', '85'), ('Tom', '19', '80')]

    解法一

    lst = []
    while True:
        s = input().split(',')
        if not s[0]:                          # breaks for blank input
            break
        lst.append(tuple(s))
    
    lst.sort(key= lambda x:(x[0],x[1],x[2])) 
    print(lst)
    

    Question 20:

    Define a class with a generator which can iterate the numbers, which are divisible by 7, between a given range 0 and n.

    解法一

    
    class Test:
        def generator(self,n):
            return [i for i in range(n) if i%7==0]   
    
    n = int(input())
    num = Test()
    lst = num.generator(n)
    print(lst)
    

    源代码下载

    这十道题的代码在我的github上,如果大家想看一下每道题的输出结果,可以点击以下链接下载:

    我的运行环境Python 3.6+,如果你用的是Python 2.7版本,绝大多数不同就体现在以下3点:

    • raw_input()在Python3中是input()
    • print需要加括号
    • fstring可以换成.format(),或者%s,%d

    谢谢大家,我们下期见!希望各位朋友不要吝啬,把每道题的更高效的解法写在评论里,我们一起进步!!!

关键字