python练习题-随机数生成与遍历

题目要求

生成有100个随机正整数的列表,随机数小于1000,遍历列表,删除其中的素数,然后输出最大值,将剩余数值降序输出

思路分析

随机数的生成需要使用random模块

lst = [random.randint(2, 999) for i in range(100)]

素数,是大于1的数,除了1和自身,没有其他的因数,大白话就是除了1和自身,除以其他的数都得不到整数结果

假设一个数值是M,那么从2开始到M//2 ,用M逐个对这些数取模,如果得到0,就说明可以整除,M就不是素数

为啥只遍历到M//2 呢,因为大于M//2的数,除了M意外,其他的肯定不能被整除,简单的数学知识,不必再解释

def is_prime(number):
    for i in range(2, number/2):
        if number % 2 == 0:
            return False

    return True

想要删除素数,千万不能这么写

for number in lst:
    if is_prime(number):
        lst.remove(number)

在使用for循环对列表进行遍历时,本质上是在根据数据的索引获取数据,如果使用remove方法删除的某个数据,那么被删除的数据后面的数据的索引都发生了改变,会影响for循环,导致紧挨着你删除的数据的下一个数据无法遍历到,下面的这个例子可以很清楚的观察到这个情况

lst = [2, 4, 6, 8, 10, 12]
for number in lst:
    print(number)
    if number % 2 == 0:
        lst.remove(number)

print(lst)

不能用remove,咋办呢,可以使用列表推导式,也可以使用一个新的列表来存储非素数

lst = [item for item in lst if not is_prime(item)]

或者

new_lst = []
for item in lst:
    if not is_prime(item):
        new_lst.append(item)

最后找出列表最大值,可以使用max内置函数,也可以对列表进行排序,从大到小

完整示例代码

import random

# 生成100个随机正整数
lst = [random.randint(1, 1000) for i in range(100)]


def is_prime(number):
    """
    判断一个正整数是否为素数
    :param number:
    :return:
    """
    for i in range(2, number//2):
        if number % i == 0:
            return False

    return True

# 过滤素数
lst = [item for item in lst if not is_prime(item)]

# 从大到小排序
lst.sort(reverse=True)
print(lst[0])  # 最大值

# 倒序输出
for item in lst:
    print(item)

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案