• python面试_总结03_列表练习题


    1、列表练习题

    完成下列列表相关的编程题,先运行下列的test函数,在完成每道题之后,都可以通过调用test函数检测所写函数对错。

    def test(got, expected):
        if got == expected:
            prefix = '正确!'
        else:
            prefix = '错误!'
        print('%s 你的结果: %s 应该返回的结果: %s' % (prefix, repr(got), repr(expected)))

    习题1

    输入一个字符串列表,返回同时满足以下两个条件的字符串的个数:

    • 1.字符串长度大等于2
    • 2.字符串的第一个字符等于最后一个字符

    注意:python语言中没有 ++ 操作符,但是有 += 操作符。

    # 可运行代码自测
    test(match_ends(['aba', 'xyz', 'aa', 'x', 'bbb']), 3)
    test(match_ends(['', 'x', 'xy', 'xyx', 'xx']), 2)
    test(match_ends(['aaa', 'be', 'abc', 'hello']), 1)
    正确! 你的结果: 3 应该返回的结果: 3
    正确! 你的结果: 2 应该返回的结果: 2
    正确! 你的结果: 1 应该返回的结果: 1

    习题2

    输入一个字符串列表,返回满足以下条件的字符串列表:

    • 1.按字母顺序从小到大排序
    • 2.第一个字母是'x'的字符串排列在最前面

    例如:输入 ['mix', 'xyz', 'apple', 'xanadu', 'aardvark'] ,应该返回 ['xanadu', 'xyz', 'aardvark', 'apple', 'mix']

    提示:可以通过生成两个列表并对它们分别进行排序,然后再把它们连接起来。

    def front_x(words):
        # +++your code here+++
        # 创建两个列表,list1用于存首字母是x的,list2存其他
        list1 = []
        list2 = []
        # 取出字符串列表中的每个字符串
        for s in words:
            # print(s)
            # 首字母是x
            if s[0] == 'x':
                list1.append(s)
            # 其他
            else:
                list2.append(s)
        # print(list1)
        # print(list2)
        # 对两个列表分别排序
        list1 = sorted(list1)
        list2 = sorted(list2)
        # 将两个列表拼接
        list1.extend(list2)
    
        return list1
    # 可运行代码自测
    test(front_x(['bbb', 'ccc', 'axx', 'xzz', 'xaa']), ['xaa', 'xzz', 'axx', 'bbb', 'ccc'])
    test(front_x(['ccc', 'bbb', 'aaa', 'xcc', 'xaa']), ['xaa', 'xcc', 'aaa', 'bbb', 'ccc'])
    test(front_x(['mix', 'xyz', 'apple', 'xanadu', 'aardvark']), ['xanadu', 'xyz', 'aardvark', 'apple', 'mix'])
    正确! 你的结果: ['xaa', 'xzz', 'axx', 'bbb', 'ccc'] 应该返回的结果: ['xaa', 'xzz', 'axx', 'bbb', 'ccc']
    正确! 你的结果: ['xaa', 'xcc', 'aaa', 'bbb', 'ccc'] 应该返回的结果: ['xaa', 'xcc', 'aaa', 'bbb', 'ccc']
    正确! 你的结果: ['xanadu', 'xyz', 'aardvark', 'apple', 'mix'] 应该返回的结果: ['xanadu', 'xyz', 'aardvark', 'apple', 'mix']

    习题3

    输入一个非空的元组列表,返回按列表中元组的最后一个元素从小到大排序后的元组列表

    例如:输入:[(1, 7), (1, 3), (3, 4, 5), (2, 2)],应该返回:[(2, 2), (1, 3), (3, 4, 5), (1, 7)]

    提示:使用自定义键=函数从每个元组提取最后一个元素

    def sort_last(tuples):
        # +++your code here+++
        print("最开始的我是这样的:", tuples)
        # 创建一个字典用于保存数据
        dict_ = {}
        # 创建一个列表用于保存最终排序结果
        list_end = []
        # 得到列表中元组的最后一个元素
        for i in tuples:
            dict_[i[-1]] = i
        print("得到的字典长啥样: ", dict_)
        
        # 得到字典中的keys的列表
        list_keys = dict_.keys()
        print("得到的列表长啥样: ", list_keys)
        # 根据字典中的keys进行排序
        list_keys = sorted(list_keys)
        print("将keys列表排序后: ", list_keys)
        # 依次取出keys
        for i in list_keys:
            # 利用键值对,将排序好的keys对应的values,依次装入新的列表
            list_end.append(dict_[i])
        print("最终的我是这样的: ", list_end)
        
        return list_end
    # 可运行代码自测
    test(sort_last([(1, 3), (3, 2), (2, 1)]), [(2, 1), (3, 2), (1, 3)])
    最开始的我是这样的: [(1, 3), (3, 2), (2, 1)]
    得到的字典长啥样:  {3: (1, 3), 2: (3, 2), 1: (2, 1)}
    得到的列表长啥样:  dict_keys([3, 2, 1])
    将keys列表排序后:  [1, 2, 3]
    最终的我是这样的:  [(2, 1), (3, 2), (1, 3)]
    正确! 你的结果: [(2, 1), (3, 2), (1, 3)] 应该返回的结果: [(2, 1), (3, 2), (1, 3)]

    习题4

    输入一个数字列表,将所有相邻且相同的元素去重保留一个元素后返回

    例如:输入[1, 2, 2, 3] 返回 [1, 2, 3];输入[1, 1, 2, 2, 3, 3, 3] 返回 [1, 2, 3]

    def remove_adjacent(ll):
        # +++your code here+++
        # 逆序,这样就不会出现下标溢出的情况
        for i in range(len(ll) - 1, 0, -1):
            # print("现在都到了第%d步" % i)
            # print(ll)
            if ll[i] == ll[i-1]:
                # 删除相邻且重复的元素
                del ll[i]
        return ll
    # 可运行代码自测
    test(remove_adjacent([1, 2, 2, 3]), [1, 2, 3])
    test(remove_adjacent([2, 2, 3, 3, 3]), [2, 3])
    test(remove_adjacent([]), [])
    正确! 你的结果: [1, 2, 3] 应该返回的结果: [1, 2, 3]
    正确! 你的结果: [2, 3] 应该返回的结果: [2, 3]
    正确! 你的结果: [] 应该返回的结果: []

    习题5

    给定两个按递增顺序排序的列表,创建并返回一个合并的按排序排列的所有元素的列表。

    例如输入 ['aa', 'xx', 'zz'], ['bb', 'cc'],应该返回['aa', 'bb', 'cc', 'xx', 'zz']

    希望你提供的解决方案在“线性”时间内工作,使两个列表都可以一次完成。

    def linear_merge(list1, list2):
        # +++your code here+++
        result = []
        while len(list1) and len(list2):
            # 对两个列表首字符串元素比较大小
            if list1[0] < list2[0]:
                # result添加该元素,并且在原列表中删除该元素
                result.append(list1.pop(0))
            else:
                result.append(list2.pop(0))
            
        # 循环结束后,因为两个列表的长度可能不同,会存在冗余
        result.extend(list1)
        result.extend(list2)
            
        return result
    # 可运行代码自测
    test(linear_merge(['aa', 'xx', 'zz'], ['bb', 'cc']),['aa', 'bb', 'cc', 'xx', 'zz'])
    test(linear_merge(['aa', 'xx'], ['bb', 'cc', 'zz']),['aa', 'bb', 'cc', 'xx', 'zz'])
    test(linear_merge(['aa', 'aa'], ['aa', 'bb', 'bb']),['aa', 'aa', 'aa', 'bb', 'bb'])
    正确! 你的结果: ['aa', 'bb', 'cc', 'xx', 'zz'] 应该返回的结果: ['aa', 'bb', 'cc', 'xx', 'zz']
    正确! 你的结果: ['aa', 'bb', 'cc', 'xx', 'zz'] 应该返回的结果: ['aa', 'bb', 'cc', 'xx', 'zz']
    正确! 你的结果: ['aa', 'aa', 'aa', 'bb', 'bb'] 应该返回的结果: ['aa', 'aa', 'aa', 'bb', 'bb']


  • 相关阅读:
    poj2752Seek the Name, Seek the Fame【kmp next数组应用】
    poj1961Period【kmp next数组】
    poj2406(kmp next数组)
    KMP原理
    0529
    0428
    2045年4月25日
    0421
    黄金连分数【大数】
    学习linux内核时常碰到的汇编指令(1)
  • 原文地址:https://www.cnblogs.com/kongweisi/p/12097203.html
Copyright © 2020-2023  润新知