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']


posted @ 2019-12-25 16:02  胖白白  阅读(691)  评论(0编辑  收藏  举报