Python基本功之利用列表、字典和zip函数处理数据

168 阅读2分钟

最近重温Python基础语法,一道练习题巩固下列表、字典、循环

给定下面两个列表 attributes 和 values,要求针对 values 中每一组子列表 value,输出其和 attributes 中的键对应后的字典,最后返回字典组成的列表,请分别用一行和多行条件循环语句,来实现这个功能

attributes = ['name', 'dob', 'gender']
values = [['jason', '2000-01-01', 'male'], 
['mike', '1999-01-01', 'male'],
['nancy', '2001-02-01', 'female']
]

# expected output:
[{'name': 'jason', 'dob': '2000-01-01', 'gender': 'male'}, 
{'name': 'mike', 'dob': '1999-01-01', 'gender': 'male'}, 
{'name': 'nancy', 'dob': '2001-02-01', 'gender': 'female'}]

多行一:使用 enumeratefor 循环

使用 enumerate 来迭代属性名列表,同时索引值列表。

result = []
for value in values:
    dict1 = {}  # 创建一个空字典
    for index, item in enumerate(attributes):
        dict1[item] = value[index]  # 将属性名作为键,对应的值作为值
    result.append(dict1)  # 将生成的字典添加到结果列表中
print("result1", result)

多行二:反向使用 enumerate

类似于第一种,但在值列表上使用 enumerate,然后从属性列表中索引。

result2 = []
for value in values:
    dict2 = {}  # 创建一个空字典
    for index, item in enumerate(value):
        dict2[attributes[index]] = item  # 使用值的索引从属性列表中获取对应的键
    result2.append(dict2)  # 将生成的字典添加到结果列表中
print("result2", result2)

一行:使用 zip 函数和列表推导式

使用 zip 函数结合列表推导式

result3 = [dict(zip(attributes, value)) for value in values]
print("result3", result3)

zip 函数

zip 函数在 Python 中用于将多个迭代器(如列表、元组)的元素打包成一个个元组,然后返回由这些元组组成的一个迭代器。

使用 zip 时,它会从每个提供的迭代器中依次取出一个元素,将它们组合成一个新的元组,并将这个新的元组作为结果的一部分返回。当最短的输入迭代器被耗尽时,zip 函数会停止生成更多的元组。

list1 = [1, 2, 3]
list2 = ['a', 'b', 'c']

# 使用zip将两个列表的元素配对
zipped = list(zip(list1, list2))  # 输出:[(1, 'a'), (2, 'b'), (3, 'c')]

# 我们也可以通过解压缩的方式还原列表
numbers, letters = zip(*zipped)
print(list(numbers))  # 输出:[1, 2, 3]
print(list(letters))  # 输出:['a', 'b', 'c']

zip 函数用于将 attributes 列表(包含键的列表)和 values 列表中的每个子列表(包含对应值的列表)合并,这样就可以方便地创建出每个属性和值对应的字典。