进阶 12: 练习题

使用 python 统计列表中的元素出现次数,按升序排序输出

def count_and_sort(lst):
    # 创建一个字典来存储每个元素出现的次数
    count_dict = {}

    # 统计每个元素的出现次数
    for item in lst:
        if item in count_dict:
            count_dict[item] += 1
        else:
            count_dict[item] = 1

    # 将字典转换为一个列表,其中每个元素是一个元组(元素, 出现次数)
    count_list = [(item, count) for item, count in count_dict.items()]

    # 按出现次数对列表进行排序
    count_list.sort(key=lambda x: x[1])

    return count_list


# 示例列表
lst = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple', 'pear', 'orange', 'banana', 'banana']

# 调用函数并打印结果
sorted_counts = count_and_sort(lst)
for item, count in sorted_counts:
    print(f'{item}: {count}')
进阶 12: 练习题

详细讲解:

知识点一: 统计元素出现次数

for item in lst:
    if item in count_dict:
        count_dict[item] += 1
    else:
        count_dict[item] = 1
  • 循环遍历(for loop): 使用 for item in lst: 循环遍历列表 lst 中的每个元素。
  • 检查元素是否在字典中:
    • if item in count_dict: 检查当前元素 item 是否已经在 count_dict 字典中。
    • 如果在字典中,说明该元素之前已经出现过,此时就将字典中对应的值(计数)加 1:count_dict[item] += 1
    • 如果不在字典中,说明这是该元素第一次出现,此时将其添加到字典并将计数初始化为 1:count_dict[item] = 1

通过这个循环,最终 count_dict 字典就会包含列表中每个元素的出现次数。例如,对于示例列表,count_dict 可能会变成:

{
    'apple': 3,
    'banana': 4,
    'orange': 2,
    'pear': 1
}

知识点二:转换字典为列表

字典遍历的方式:将每个元素(键值对)打包成一个元祖 items()
=> 完整格式

# 创建一个空列表
count_list = []

# 遍历字典的键值对
for item,count in count_dict.items(): # 解包思想
    # 将每个键值对打包成元组并添加到计数列表中
    count_list.append((item,count))
count_list = [(item, count) for item, count in count_dict.items()]

这行代码使用了一个列表推导式(list comprehension)将 count_dict 字典中的内容转换为一个列表 count_list。这个列表中的每个元素都是一个元组 (item, count),其中 item 是元素,count 是其出现次数。

通过 count_dict.items() 方法,我们可以获取字典中所有的键值对。这一行代码将会生成一个如下的列表:

[
    ('apple', 3),
    ('banana', 4),
    ('orange', 2),
    ('pear', 1)
]

知识点三:排序+lambda 函数(两种组合常用,这里尽量记住)

count_list.sort(key=lambda x: x[1])
  • count_list.sort(...) 方法会就地排序 count_list 列表。
  • key=lambda x: x[1] 表示排序的依据是每个元组的第二个元素(即出现次数 count)。lambda x: x[1] 是一个匿名函数,输入每个元组 x,输出元组的第二个元素。

经过这一步,count_list 列表就会按出现次数升序排列。对于示例列表,排序后可能是:

[
    ('pear', 1),
    ('orange', 2),
    ('apple', 3),
    ('banana', 4)
]

有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?请用 python 写出

numbers = [1, 2, 3, 4]
unique_numbers = []

for i in numbers:
    for j in numbers:
        for k in numbers:
            if i != j and j != k and i != k:
                num = i * 100 + j * 10 + k
                unique_numbers.append(num)

print("可以组成的三位数数量:", len(unique_numbers))
print("这些三位数是:", unique_numbers)

这段代码通过三个嵌套循环,遍历所有可能的组合,并确保每个数字在每种组合中都是唯一的。最终,它会输出所有符合条件的三位数以及它们的数量。运行这段代码,将会看到12个不重复的三位数。

进阶 12: 练习题

求出100以内的所有质数(只能被1和本身除尽的数)

我们定义了一个 is_prime 函数来判断一个数字是否为质数。然后,我们使用列表推导式找出 2 到 100 之间的所有质数,并将它们存储在 prime_numbers 列表中。最后打印出这些质数。

def is_prime(num):
    if num <= 1:
        return False
    for i in range(2, int(num ** 0.5) + 1):
        if num % i == 0:
            return False
    return True

prime_numbers = [num for num in range(2, 101) if is_prime(num)]
print(prime_numbers)

在这里,我们定义了一个 is_prime 函数来判断一个数字是否为质数。然后,我们使用列表推导式找出 2 到 100 之间的所有质数,并将它们存储在 prime_numbers 列表中。最后打印出这些质数。

运行结果:

进阶 12: 练习题

求出所有三位数中的水仙花数(水仙花数: 首先是一个三位数,其每一位上的数字的立方和等于该数字本身。例: 153 = 1 + 125 + 27)

# 水仙花数示例
def find_narcissistic_numbers():
    # 创建一个列表用于存储水仙花数
    narcissistic_numbers = []

    # 遍历所有三位数
    for number in range(100, 1000):
        # 将数字划分为百位、十位和个位
        hundreds_digit = number // 100
        tens_digit = (number // 10) % 10
        units_digit = number % 10

        # 计算各个位数字的立方和
        sum_of_cubes = hundreds_digit**3 + tens_digit**3 + units_digit**3

        # 如果立方和等于原数,则认定为水仙花数
        if sum_of_cubes == number:
            narcissistic_numbers.append(number)

    return narcissistic_numbers

# 打印输出所有三位数的水仙花数
narcissistic_numbers = find_narcissistic_numbers()
print("三位数中的水仙花数有:", narcissistic_numbers)
进阶 12: 练习题

使用 python 实现输入若干数字,当输入quit时退出输入,计算输入数字中的最大值,最小值,总和,平均值

代码说明

  1. 输入循环:程序在无限循环中持续接收用户输入。
  2. 退出机制:当用户输入 "quit" 时,退出输入循环。
  3. 输入处理:尝试将输入转换为浮点数,如果失败(即输入的不是数字),则提示用户输入有效的数字,并继续下次循环。
  4. 计算结果:在用户输入数字后,如果列表 numbers 中有数据,则计算并打印最大值、最小值、总和和平均值。
  5. 边界处理:如果用户没有输入任何数字而直接退出,则显示一条信息告知没有输入数据。
def main():
    numbers = []  # 用于存储用户输入的数字

    while True:
        user_input = input("请输入一个数字(输入 'quit' 退出):")

        if user_input.lower() == 'quit':
            break  # 退出循环

        try:
            number = float(user_input)  # 将输入转换为浮点数
            numbers.append(number)  # 将数字添加到列表中
        except ValueError:
            print("请输入一个有效的数字!")
            continue

    if numbers:
        max_value = max(numbers)
        min_value = min(numbers)
        total_sum = sum(numbers)
        average = total_sum / len(numbers)

        print(f"最大值:{max_value}")
        print(f"最小值:{min_value}")
        print(f"总和:{total_sum}")
        print(f"平均值:{average}")
    else:
        print("没有输入任何数字。")


if __name__ == "__main__":
    main()

使用 python 实现: 输入两个数字 a, b 求s=a+aa+aaa+aaaa+aa...a的值 ,有b个这样的项,然后将它们相加。例如输入 2, 5 输出结果 2+22+222+2222+22222 = 24690(此时共有5个数相加)

我们使用一个循环来反复构建每一个项。每次迭代,我们将数字 a 转换为字符串并附加到 current_number 中,然后转换回整数并加到 total_sum。这样就可以获得所需的序列和。

def compute_sum(a, b):
    total_sum = 0
    current_number = ""

    for _ in range(b):
        current_number += str(a)  # 构建当前的数
        total_sum += int(current_number)  # 将当前的数转换为整数并累加到总和中

    return total_sum

# 示例用法
a = 2
b = 5
result = compute_sum(a, b)
print(result)  # 输出: 24690

python 实现 自定义实现 int(),将一个数字字符串转换成真正的数字,并返回

要自定义实现 int() 函数,将一个数字字符串转换为整数,可以手动解析字符串中的每个字符,将其转换为对应的数字,然后根据其位置计算结果。

def custom_int(s):
    # 检查是否为空字符串
    if not s:
        raise ValueError("输入字符串为空")

    # 设定初始值
    num = 0
    # 用来标识符号
    is_negative = False

    # 处理负号
    start_index = 0
    if s[0] == '-':
        is_negative = True
        start_index = 1

    # 构建数字
    for i in range(start_index, len(s)):
        char = s[i]
        # 检查字符是否为数字
        if '0' <= char <= '9':
            digit = ord(char) - ord('0')
            num = num * 10 + digit
        else:
            raise ValueError(f"无效字符: {char}")

    if is_negative:
        num = -num

    return num

# 示例用法
try:
    print(custom_int("123"))    # 输出: 123
    print(custom_int("-456"))   # 输出: -456
    print(custom_int("0"))      # 输出: 0
    print(custom_int("00012"))  # 输出: 12
except ValueError as e:
    print(e)

现有 姓氏 和 名字 若干,设计函数得到一个随机的名字

示例数据:

# 示例数据
surnames = ["张", "李", "王", "刘", "陈"]
given_names = ["伟", "娜", "敏", "静", "磊"]

要生成一个随机的名字,你可以使用 Python 的 random 模块。假设你有两个列表:一个包含不同的姓氏,另一个包含不同的名字。你可以编写一个函数来随机选择一个姓氏和一个名字,然后将它们组合成一个完整的名字。以下是示例代码:

import random

def generate_random_name(surnames, given_names):
    """
    从给定的姓氏和名字列表中随机生成一个名字。
    
    :param surnames: 包含多个姓氏的列表
    :param given_names: 包含多个名字的列表
    :return: 随机生成的名字(姓氏和名字组合)
    """
    # 从姓氏列表中随机选择一个
    surname = random.choice(surnames)
    # 从名字列表中随机选择一个
    given_name = random.choice(given_names)
    # 返回组合后的全名
    return f"{surname}{given_name}"

# 示例数据
surnames = ["张", "李", "王", "刘", "陈"]
given_names = ["伟", "娜", "敏", "静", "磊"]

# 生成一个随机名字
random_name = generate_random_name(surnames, given_names)
print(random_name)

说明:

  • random.choice(): 该函数从提供的列表中随机返回一个元素。在这个例子中,它用于从姓氏和名字列表中分别选择一个随机项。
  • 字符串格式化: 使用简单的字符串拼接 (f"{surname}{given_name}") 来生成完整的名字。

使用 python 实现:利用随机数得到一个随机的字母和数字组成的四位验证码,然后输入看到的验证码,如果输入正确结束程序,输入错误持续输入直到正确为止。如果输入三次不正确,更换验证码后继续

import random
import string

def generate_verification_code():
    """生成一个四位由字母和数字组成的验证码"""
    all_chars = string.ascii_letters + string.digits
    return ''.join(random.choice(all_chars) for _ in range(4))

def input_with_prompt(prompt):
    """提示用户输入,并返回其输入的字符串"""
    return input(prompt)

def verification_process():
    """进行验证码验证的主要流程"""
    attempts = 0  # 当前错误次数
    max_attempts = 3  # 每验证码允许输入错误的最大次数

    code = generate_verification_code()  # 生成初始验证码
    print(f"验证码是: {code}")
    
    while True:
        user_input = input_with_prompt("请输入验证码: ")
        if user_input == code:
            print("验证码正确,程序结束!")
            break
        else:
            attempts += 1
            print("验证码错误!")

        if attempts >= max_attempts:
            code = generate_verification_code()  # 更换新的验证码
            print(f"验证码错误次数过多,生成新的验证码: {code}")
            attempts = 0  # 重置错误次数

# 运行验证过程
verification_process()

代码说明:

  • generate_verification_code(): 生成一个四位随机的验证码,该验证码由字母和数字组成。
  • input_with_prompt(): 提示用户输入,并返回输入的字符串。这样可以将用户输入的逻辑独立出来,便于后续扩展。
  • verification_process(): 验证码验证的主要流程。它初始化错误次数,并在每次用户输入时检查其是否正确。若正确,程序结束;若连续三次错误,更换新的验证码并继续,直到用户输入正确为止。

运行示例:

  1. 生成初始验证码并提示用户输入。
  2. 如果用户输入正确,打印“验证码正确,程序结束!”并结束程序。
  3. 如果用户输入错误,增加错误计数并提示“验证码错误!”。
  4. 如果错误计数达到三次,生成新的验证码并重置错误计数,继续提示用户输入新验证码。

使用 python求出所有字符串的最小前缀

def find_smallest_common_prefix(strs):
    if not strs:
        return ""

    # 假设第一个字符串的全部是最小公共前缀
    prefix = strs[0]

    # 逐个比较其他字符串
    for s in strs[1:]:
        # 缩短 prefix 直到它适合当前字符串
        while not s.startswith(prefix):
            prefix = prefix[:-1]
            if not prefix:
                return ""

    return prefix

# 示例用法
strings = ["flower", "flow", "flight"]
result = find_smallest_common_prefix(strings)
print(f"最小公共前缀是: '{result}'")

代码说明:

  • 初始条件:首先检查输入的字符串列表是否为空。如果为空,直接返回空字符串。
  • 初始前缀:假设第一个字符串的全部是最小公共前缀。
  • 逐步缩短:使用 startswith() 检查当前前缀是否是其他字符串的前缀。若不是,则逐个缩短前缀,直到找到一个共同前缀,或者前缀变为空。
  • 返回结果:一旦找出最小公共前缀,就返回它。如果找不到任何公共前缀,返回空字符串。

使用 python 按从高到低的顺序统计文章text中所有单词的使用频率

我们可以使用基本的 Python 数据结构(如字典)来统计每个单词的频率,然后对结果进行排序。

import re

def count_word_frequency(text):
    # 移除标点符号,并将文本转换为小写
    cleaned_text = re.sub(r'[^\w\s]', '', text).lower()
    
    # 拆分文本为单词列表
    words = cleaned_text.split()
    
    # 使用字典统计单词频率
    word_count = {}
    for word in words:
        if word in word_count:
            word_count[word] += 1
        else:
            word_count[word] = 1
    
    # 根据频率排序
    sorted_word_count = sorted(word_count.items(), key=lambda item: item[1], reverse=True)
    
    return sorted_word_count

# 示例文本
text = """
Python is an interpreted, high-level, general-purpose programming language. 
Created by Guido van Rossum and first released in 1991, Python has a design philosophy that emphasizes code readability, notably using significant whitespace. 
It provides constructs that enable clear programming on both small and large scales.
"""

# 统计词频
word_frequency = count_word_frequency(text)

# 打印结果
for word, freq in word_frequency:
    print(f"{word}: {freq}")

代码说明:

  • 正则表达式 (re):用于去掉所有非字母数字的字符,让文本只保留单词字符和空白符。
  • 字典 (dict):用于存储每个单词及其对应的出现次数。
  • 字典填充:遍历单词列表时,对每个单词在字典中进行计数。
  • 排序:使用列表的 sorted() 函数对字典的项按频率排序,key=lambda item: item[1] 表示按频率排序,reverse=True 用于从高到低排序。

发布者:LJH,转发请注明出处:https://www.ljh.cool/42175.html

(0)
上一篇 2024年12月15日 下午11:44
下一篇 2023年4月2日 下午6:18

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注