PYTHON基础技能 – Python高手秘籍:17个字典推导式实战案例
今天我们要探索字典推导式的奥秘。别看它名字复杂,其实它就是一种让你的代码变得更加简洁、优雅的秘密武器。
第一站:基础岛
案例1:简单转换
想象一下,你有一堆人的名字(列表),你想把它们变成大写形式的字典键值对。
names = ['Alice', 'Bob', 'Charlie']
upper_names = {name: name.upper() for name in names}
print(upper_names)
这行代码的意思是:“对于names里的每个名字,创建一个新的键值对,键是名字本身,值是名字的大写形式。”简单吧?
第二站:映射大陆
案例2:数值翻倍
你得到了一个数字列表,想得到一个新字典,其中每个数字翻倍。
numbers = [1, 2, 3]
doubled = {num: num * 2 for num in numbers}
print(doubled)
“每一个数字,乘以2,装进字典”,搞定!
第三站:条件海域
案例3:筛选偶数
只保留列表中偶数的键值对。
numbers = [1, 2, 3, 4, 5]
even_only = {num: "Even" for num in numbers if num % 2 == 0}
print(even_only)
“如果数字能被2整除,就让它成为字典的一部分。”
第四站:复合键值
案例4:姓名与年龄
给定两个列表,创建一个字典,名字作为键,年龄作为值。
names = ['Alice', 'Bob']
ages = [24, 30]
name_age = {name: age for name, age in zip(names, ages)}
print(name_age)
“手拉手,一对一对进字典。”
第五站:嵌套冒险
案例5:嵌套列表转字典
假设你有嵌套列表,想提取每个子列表的第一个元素作为键,整个子列表作为值。
data = [['John', 28], ['Anna', 24], ['Peter', 35]]
nested_dict = {item[0]: item for item in data}
print(nested_dict)
“每个小队的第一个成员当队长,整个小队跟着走。”
第六站:集合挑战
案例6:列表去重
将两个列表的交集作为键,它们在原列表中的索引作为值。
list1 = [1, 2, 3, 4]
list2 = [2, 3, 4, 5]
indexes = {val: (i, j) for i, x in enumerate(list1) for j, y in enumerate(list2) if x == y}
print(indexes)
“找到共同点,记住他们的家。”
第七站:字符串乐园
案例7:字符频率
统计字符串中每个字符出现的次数。
text = "hello world"
freq = {char: text.count(char) for char in text}
print(freq)
“每个字母,数一数你的朋友们。”
第八站:逻辑迷宫
案例8:基于条件的映射
创建一个字典,键是数字,值是该数字是否为质数的判断结果。
def is_prime(n):
return n > 1 and all(n % i for i in range(2, int(n**0.5) + 1))
numbers = list(range(1, 11))
prime_check = {num: is_prime(num) for num in numbers}
print(prime_check)
“对于每个数字,做个质数测试。”
第九站:字典合并
案例9:合并字典
合并两个字典,相同键的值相加。
dict1 = {"a": 1, "b": 2}
dict2 = {"b": 3, "c": 4}
merged = {k: dict1.get(k, 0) + dict2.get(k, 0) for k in set(dict1) | set(dict2)}
print(merged)
“你一半,我一半,合并起来不重叠。”
第十站:转换工厂
案例10:JSON到字典
解析简单的JSON字符串到字典。
import json
json_str = '{"name": "Alice", "age": 30}'
parsed_json = json.loads(json_str)
print(parsed_json)
“从字符串的魔法中解放数据。”
第十一站:高级筛选
案例11:基于多个条件的字典生成
从一个大字典中根据多个条件筛选出子字典。
big_dict = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
filtered = {k: v for k, v in big_dict.items() if v > 2 and v < 5}
print(filtered)
“严格筛选,只留下符合条件的。”
第十二站:终极挑战
案例12:字典中字典的创造
创建一个字典,每个键对应另一个字典,根据一些复杂的规则。
keys = ['A', 'B', 'C']
values = [{'x': 1, 'y': 2}, {'x': 3, 'y': 4}, {'x': 5, 'y': 6}]
compound_dict = {k: {f'val_{i}': v[i] for i in v} for k, v in zip(keys, values)}
print(compound_dict)
“字典里还有字典,层层嵌套的秘密。”
高级篇:进阶技巧与应用
第十三站:列表内字典的处理
案例13:转换列表为字典列表
想象你有一个列表,每个元素都是包含名字和年龄的列表,你想转换成字典列表。
people_info = [["Alice", 28], ["Bob", 30]]
people_dicts = [{name: age} for name, age in people_info]
print(people_dicts)
这里,我们循环遍历列表,将每个子列表转换成一个字典,并添加到新的列表中。
第十四站:字典的深度操作
案例14:扁平化嵌套字典
有时你需要处理嵌套字典,比如将所有顶层键值对提取出来。
nested_dict = {'a': {'x': 1}, 'b': {'y': 2, 'z': 3}}
flat_dict = {k: v for nested_key in nested_dict for k, v in nested_dict[nested_key].items()}
print(flat_dict)
这段代码通过两层循环,遍历了嵌套字典的所有第一层键值对。
第十五站:结合函数与推导式
案例15:使用函数增强表达
利用函数来增强字典推导式的功能,比如计算平方。
nums = [1, 2, 3, 4]
square_dict = {num: (lambda x: x*x)(num) for num in nums}
# 或更简洁地使用 pow 函数
square_dict = {num: pow(num, 2) for num in nums}
print(square_dict)
这里展示了如何在字典推导式中直接调用函数,增加表达的灵活性。
第十六站:元组与字典推导的结合
案例16:基于元组的映射
如果你有一个元组列表,每个元组代表键值对,可以用推导式快速转换。
pairs = [('name', 'Alice'), ('age', 28)]
mapping = dict(pairs)
print(mapping)
虽然不是传统意义上的字典推导,但使用 dict() 直接转换元组列表也是一种简洁的方法。
第十七站:动态属性设置
案例17:对象属性到字典
如果你想要将类的实例属性转化为字典,可以这样做:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
person = Person('Alice', 28)
person_dict = {attr: getattr(person, attr) for attr in dir(person) if not attr.startswith("__")}
print(person_dict)
这段代码通过遍历实例的所有属性并排除特殊方法,展示了如何将对象属性转化为字典。