Python列表实战:用5个趣味小项目搞定数据脱敏、质因数分解和摩斯电码
记得刚开始学Python时,最让我头疼的就是列表操作。那些枯燥的增删改查练习,简直像在背字典一样无趣。直到有一天,我把购物砍价的过程写成代码,才突然发现——原来列表可以这么玩!今天,我就带大家用5个生活化的小项目,把列表操作变成一场有趣的编程游戏。
1. 砍价模拟器:随机数与列表的完美配合
每次网购看到"砍价免费拿",你是不是也好奇背后的算法?我们用Python列表来模拟这个有趣的过程:
import random def bargain_simulator(target_price, seed): random.seed(seed) current_price = target_price history = [] while current_price > 0: reduction = random.randint(0, target_price//10) current_price -= reduction history.append((len(history)+1, reduction, current_price)) if current_price <= 0: history[-1] = (len(history), reduction, 0) # 确保最终价格为0 break return history关键点解析:
random.seed()确保每次运行结果可复现- 使用列表
history记录每次砍价明细 - 三元组
(次数, 砍掉金额, 剩余金额)存储完整过程
提示:实际项目中,可以添加用户输入验证和异常处理,使程序更健壮。
运行示例:
result = bargain_simulator(1000, 42) for step in result: print(f"第{step[0]}刀:砍掉{step[1]}元,还剩{step[2]}元")2. 智能数据脱敏系统:字符串与列表的魔法
处理用户敏感信息时,脱敏是必备技能。下面这个方案比简单替换更灵活:
def data_masking(users_data): masked_data = [] rules = [ lambda x: x[:4] + '*'*7 + x[11:], # 身份证号规则 lambda x: x[:1] + '*' + x[2:], # 手机号规则 lambda x: x[:3] + '*'*4 + x[7:] # 银行卡规则 ] for user in users_data: masked_user = [rule(field) if i<3 else field for i, field in enumerate(user)] masked_data.append(masked_user) return masked_data进阶技巧:
- 使用列表推导式简化代码
- 将脱敏规则存储在列表中,便于扩展
- 保留非敏感字段不变
实际应用时可以这样调用:
users = [ ["320583199003077654", "13812345678", "6225888812345678", "男"], ["51072219880506987X", "15987654321", "6228480038274619", "女"] ] print(data_masking(users))3. 质因数分解器:数学与列表的碰撞
分解质因数不仅是数学题,在密码学中也有重要应用。看如何用列表高效实现:
def prime_factors(n): factors = [] divisor = 2 while divisor <= n: if n % divisor == 0: factors.append(divisor) n = n // divisor else: divisor += 1 if divisor == 2 else 2 # 跳过偶数 # 格式化输出 factor_str = '×'.join(map(str, factors)) return f"{n} = {factor_str}" if len(factors)>1 else f"{n}是质数"性能优化点:
- 从2开始,只检查奇数除数
- 即时更新n值,减少循环次数
- 使用列表存储所有质因数
测试不同数字:
print(prime_factors(100)) # 100 = 2×2×5×5 print(prime_factors(17)) # 17是质数 print(prime_factors(123456789))4. 摩斯电码转换器:列表作为编码字典
用Python实现一个加密通信工具:
class MorseCodeTranslator: def __init__(self): self.char_to_morse = { 'A': '.-', 'B': '-...', 'C': '-.-.', 'D': '-..', 'E': '.', 'F': '..-.', 'G': '--.', 'H': '....', 'I': '..', 'J': '.---', 'K': '-.-', 'L': '.-..', 'M': '--', 'N': '-.', 'O': '---', 'P': '.--.', 'Q': '--.-', 'R': '.-.', 'S': '...', 'T': '-', 'U': '..-', 'V': '...-', 'W': '.--', 'X': '-..-', 'Y': '-.--', 'Z': '--..', ' ': '/' } self.morse_to_char = {v: k for k, v in self.char_to_morse.items()} def text_to_morse(self, text): return ' '.join(self.char_to_morse.get(char.upper(), '') for char in text) def morse_to_text(self, morse): return ''.join(self.morse_to_char.get(code, '') for code in morse.split(' '))设计亮点:
- 使用字典双向存储编码规则
- 列表推导式处理字符串转换
- 支持大小写字母和空格
使用示例:
translator = MorseCodeTranslator() message = "SOS Python" morse = translator.text_to_morse(message) print(f"'{message}' → '{morse}'") decoded = translator.morse_to_text(morse) print(f"'{morse}' → '{decoded}'")5. 智能列表维护工具:实战增删查改
开发一个增强版列表管理器,解决常见痛点:
class SmartList: def __init__(self, initial_data=None): self.data = list(initial_data) if initial_data else [] def safe_insert(self, value): """自动确定插入位置保持有序""" for i, item in enumerate(self.data): if item > value: self.data.insert(i, value) return i self.data.append(value) return len(self.data) - 1 def bulk_remove(self, values): """批量删除元素""" removed = 0 for value in values: while value in self.data: self.data.remove(value) removed += 1 return removed def find_all(self, predicate): """查找满足条件的所有元素""" return [item for item in self.data if predicate(item)] def __str__(self): return str(self.data)功能特色:
- 自动维护有序列表
- 支持批量操作
- 条件查询功能
- 完整的字符串表示
实战演示:
numbers = SmartList([10, 20, 30, 40]) print(f"初始列表: {numbers}") insert_pos = numbers.safe_insert(25) print(f"插入25后的列表: {numbers} (插入位置: {insert_pos})") removed_count = numbers.bulk_remove([10, 30]) print(f"删除10和30后的列表: {numbers} (共删除: {removed_count}个)") even_numbers = numbers.find_all(lambda x: x % 2 == 0) print(f"列表中的偶数: {even_numbers}")在真实项目中,我发现最实用的其实是safe_insert和bulk_remove这两个方法。它们解决了我早期经常遇到的索引越界和漏删问题。特别是处理动态数据时,这种封装好的方法能让代码更健壮。