面试必会!list 和 tuple 的 12 个经典使用案例
The following article is from 程序员芒果 Author 臭榴莲
点击关注公众号,一周多次包邮送书
来源:程序员芒果(ID:mongo_fish)
作者:臭榴莲
1. 判断 list 内有无重复元素
is_duplicated,使用 list 封装的 count 方法,依次判断每个元素 x 在 list 内的出现次数。如果大于 1,则立即返回 True,表示有重复。如果完成遍历后,函数没返回,表明 list 内没有重复元素,返回 False。test_list = [88, 97, 91, 78, 14, 44, 86, 89, 99, 94, 41, 19, 36, 66, 16, 80, 45, 82, 39, 98, 82]
def is_duplicated(lst):
for x in test_list:
if lst.count(x) > 1:
print(x, '重复次数:', lst.count(x))
return True
return False
# 调用方法
print(is_duplicated(test_list))
'''
82 重复次数:2
True
'''
以上方法实现不简洁,借助 set 判断更方便:
test_list = [88, 97, 91, 78, 14, 44, 86, 89, 99, 94, 41, 19, 36, 66, 16, 80, 45, 82, 39, 98, 82]
def is_duplicated(lst):
print(len(test_list) != len(set(lst)))
is_duplicated(test_list)
'''
2. 列表反转
提起列表反转我们第一想到的应该是使用切片。除此之外还有我们list自带的reverse()方法。
[::-1] 生成逆向索引(负号表示逆向),步长为 1 的切片。
test_list = [123, 'xyz', 'zara', 'abc', 'xyz']
print(test_list)
new_list = test_list[::-1]
print(new_list)
'''
[123, 'xyz', 'zara', 'abc', 'xyz']
['xyz', 'abc', 'zara', 'xyz', 123]
'''
调用 reverse:
test_list = [123, 'xyz', 'zara', 'abc', 'xyz']
print(test_list)
# list.reverse() 这一步操作的返回值是一个None,其作用的结果,需要通过打印被作用的列表才可以查看出具体的效果。
test_list.reverse()
print(test_list)
'''
[123, 'xyz', 'zara', 'abc', 'xyz']
['xyz', 'abc', 'zara', 'xyz', 123]
'''
3. 查询列表中所有重复元素
遍历列表,如果出现次数大于 1,且不在返回列表 ret 中,则添加到 ret 中。
满足 x not in ret,则表明 x 不在列表中。
test_list = [14, 88, 97, 91, 78, 14, 44, 86, 89, 99, 94, 41, 19, 36, 66, 16, 80, 45, 82, 39, 98, 82, 14]
def find_deplicated(lst):
result = []
for x in test_list:
if lst.count(x) > 1 and x not in result:
result.append(x)
return result
print(find_deplicated(test_list))
'''
[14, 82]
4. 斐波那契数列
斐波那契数列第一、二个元素都为 1,第三个元素等于前两个元素和,依次类推。
def feibo(x):
if len(x) == 1:
return x[0]
else:
return x[0] + feibo(x[1:])
print(feibo([1, 1, 2, 3, 5]))
'''
12
'''
5 . 出现次数最多
max 函数是 Python 的内置函数,所以使用它无需 import。
max 有一个 key 参数,指定如何进行值得比较。
test_list = [14, 88, 97, 91, 78, 14, 44, 86, 89, 99, 94, 41, 19, 36, 66, 16, 80, 45, 82, 39, 98, 82, 14]
def max_data(lst):
for x in lst:
if x not in lst:
return None
else:
return max(lst, key = lambda x: lst.count(x))
print(max_data(test_list))
'''
14
'''
6. 求表头
返回列表的第一个元素,注意列表为空时,返回 None。
test_list = [88, 97, 91, 78, 14, 44, 86, 89, 99, 94, 41, 19, 36, 66, 16, 80, 45, 82, 39, 98, 82, 14]
def head(lst):
return lst[0] if len(lst) > 0 else None
print(head(test_list))
'''
88
'''
7. 求表尾
类似于求表头操作,返回列表的最后一个元素,注意列表为空时,返回 None。
test_list = [88, 97, 91, 78, 14, 44, 86, 89, 99, 94, 41, 19, 36, 66, 16, 80, 45, 82, 39, 98, 82, 14]
def head(lst):
return lst[-1] if len(lst) > 0 else None
print(head(test_list))
'''
14
'''
8. 九九乘法表
外层循环一次,print(),换行;内层循环一次,打印一个等式。
for i in range(1, 10):
for j in range(1, i+1):
print(str(j) + '*' + str(i) + '=' + str(j*i), end= '\t' )
print()
'''
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
'''
9. 获取元素对
t[:-1]:原列表切掉最后一个元素;
t[1:]:原列表切掉第一个元素;
zip(iter1, iter2):实现 iter1 和 iter2 的对应索引处的元素拼接。
def pair(x):
return list(zip(x[:-1], x[1:]))
print(pair([5, 7, 9]))
'''
[(5, 7), (7,
'''
10. 样本抽样
内置 random 模块中,有一个 sample 函数,实现“抽样”功能。
我们从100-1000之间抽取是伪随机数如下:
import random
test_list = random.sample(range(100, 1000), 10)
print(test_list)
'''
[684, 719, 498, 391, 101, 311, 900, 775, 217, 333]
11. 重洗数据集
内置 random 中的 shuffle 函数,能冲洗数据。
值得注意,shuffle 是对输入列表就地(in place)洗牌,节省存储空间。
from random import shuffle, randint
# 0 -100 抽取十位随机整数
lst = [randint(0, 100) for x in range(10)]
print(lst)
shuffle(lst)
print(lst)
'''
[94, 20, 62, 31, 25, 53, 14, 35, 25, 94]
[31, 62, 20, 94, 25, 53, 25, 14, 35, 94]
如下图结果所示:
我们可以看到前5个,并不是1、2、3、4、5了,而是4、8、1、5、6。
#代码功能是测试一下shuffle()函数
import random
number = []
for index in range(1, 11):
number.append(index)
print(number)
random.shuffle(number)
for index in range(5):
print(number[index])
'''
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
6
1
9
10
·················END·················
推荐阅读
• 干掉Random,这个类已经成为获取随机数的王者• 抖音二面,内存只有 2G,如何对 100 亿数据进行排序?• 因为一个循环,CPU搞了个新技术!• 闲鱼面试官:Thread.sleep(0) 到底有什么用?我:有点懵~• GET 和 POST请求的本质区别是什么?原来我一直理解错了• Go 要违背初心吗?新提案:手动管理内存• 我去,你竟然还不会用API网关!
👇更多内容请点击👇