查看原文
其他

面试必会!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 = [889791781444868999944119366616804582399882]

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 = [889791781444868999944119366616804582399882]

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 = [1488979178144486899994411936661680458239988214]

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([11235]))
'''
12
'''


5 . 出现次数最多

max 函数是 Python 的内置函数,所以使用它无需 import。

max 有一个 key 参数,指定如何进行值得比较。

test_list = [1488979178144486899994411936661680458239988214]

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 = [88979178144486899994411936661680458239988214]
def head(lst):
    return lst[0if len(lst) > 0 else None

print(head(test_list))
'''
88
'''


7. 求表尾


类似于求表头操作,返回列表的最后一个元素,注意列表为空时,返回 None。

test_list = [88979178144486899994411936661680458239988214]
def head(lst):
    return lst[-1if len(lst) > 0 else None

print(head(test_list))
'''
14
'''



8. 九九乘法表


外层循环一次,print(),换行;内层循环一次,打印一个等式。

for i in range(110):
    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([579]))
'''
[(5, 7), (7, 
'''


10. 样本抽样


内置 random 模块中,有一个 sample 函数,实现“抽样”功能。

我们从100-1000之间抽取是伪随机数如下:

import random
test_list = random.sample(range(1001000), 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(0100for 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(111):
    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网关!

👇更多内容请点击👇

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存