Python 中将列表转换为类似键值对的列表
给定两个单独的列表,我们将通过将它们映射到一个键值数据结构(即字典)来将它们转换为单个数据结构。第一个列表的值将作为键,第二个列表的值将作为字典中相应键的值。这种关系可以被认为是一对一或一对多,即一个键可以有多个值。
现在让我们来看一个示例输入和输出,以便更好地理解如何在本文中将 Python 中的列表转换为类似键值对的列表。
输入
list1 = [3, 4, 3, 4, 5, 5] list2 = ['apple', 'banana', 'cherry', 'date', 'elderberry', 'fig']
输出
{3: ['apple', 'cherry'], 4: ['banana', 'date'], 5: ['elderberry', 'fig']}
方法一:使用 Defaultdict 和 Zip
此方法使用 defaultdict 和列表作为默认值,这有助于有效地根据第一个列表 (list1) 中的对应元素对 list2 中的元素进行分组。之后,为了清晰起见,它将 defaultdict 转换为常规字典,从而导致 list1 中的值与 list2 中的值列表的映射关系。
示例
from collections import defaultdict
list1 = [3, 4, 3, 4, 5, 5]
list2 = ['apple', 'banana', 'cherry', 'date', 'elderberry', 'fig']
result_dict = defaultdict(list)
for key, value in zip(list1, list2):
result_dict[key].append(value)
result_dict = dict(result_dict)
print("The first list is:",list1)
print("The second list is:",list2)
print("The mapped dictionary:",result_dict)
输出
The first list is: [3, 4, 3, 4, 5, 5]
The second list is: ['apple', 'banana', 'cherry', 'date', 'elderberry', 'fig']
The mapped dictionary: {3: ['apple', 'cherry'], 4: ['banana', 'date'], 5: ['elderberry', 'fig']}
方法二:使用循环和空字典
此方法创建一个名为 result_dict 的空字典。对于每一对,它会评估键(来自 list1 的元素)是否出现在 result_dict 中;如果不存在,则使用空列表初始化此键。随后,它将来自 list2 的对应值(元素)添加到其关联键的列表中:这有效地形成了一个字典,其中来自 list1 的元素作为键;但是,值由包含来自 list2 的关联元素的列表组成。
示例
list1 = [3, 4, 3, 4, 5, 5]
list2 = ['apple', 'banana', 'cherry', 'date', 'elderberry', 'fig']
result_dict = {}
for key, value in zip(list1, list2):
if key not in result_dict:
result_dict[key] = []
result_dict[key].append(value)
print("The mapped dictionary:",result_dict)
输出
The mapped dictionary: {3: ['apple', 'cherry'], 4: ['banana', 'date'], 5: ['elderberry', 'fig']}
方法三:使用列表推导和 Defaultdict
这里的 defaultdict 自动为每个键(来自 list1 的元素)创建列表;然后它将这个 defaultdict 转换为一个普通的字典。最终结果:一个映射,其中键表现为来自 list1 的元素,而值则通过来自 list2 的关联元素的列表出现。
示例
from collections import defaultdict
list1 = [3, 4, 3, 4, 5, 5]
list2 = ['apple', 'banana', 'cherry', 'date', 'elderberry', 'fig']
result_dict = defaultdict(list)
[result_dict[key].append(value) for key, value in zip(list1, list2)]
result_dict = dict(result_dict)
print("The mapped dictionary:",result_dict)
输出
The mapped dictionary: {3: ['apple', 'cherry'], 4: ['banana', 'date'], 5: ['elderberry', 'fig']}
方法四:使用字典推导
在 Python 中,我们可以通过字典推导简洁地创建字典。代码“`{key: [] for key in set(list1)}`”构造一个字典,其中来自 list1 的唯一元素充当键;这些元素初始化为值为空列表。
示例
list1 = [3, 4, 3, 4, 5, 5]
list2 = ['apple', 'banana', 'cherry', 'date', 'elderberry', 'fig']
result_dict = {key: [] for key in set(list1)}
[result_dict[key].append(value) for key, value in zip(list1, list2)]
print("The mapped dictionary:",result_dict)
输出
The mapped dictionary: {3: ['apple', 'cherry'], 4: ['banana', 'date'], 5: ['elderberry', 'fig']}
方法五:使用 Defaultdict 和 itertools.groupby
Defaultdict(list) 命令激活一个字典;这个新启动的字典等待缺失的键,所有这些键都将由空列表填充。groupby 函数根据第一个值对对进行分类 - lambda x: x[0] 表示此类分组的键。因此,list1 和 list2 元素通过执行此代码段进行排序和后续分组到 result_dict 中。
示例
from collections import defaultdict
from itertools import groupby
list1 = [3, 4, 3, 4, 5, 5]
list2 = ['apple', 'banana', 'cherry', 'date', 'elderberry', 'fig']
sorted_lists = sorted(zip(list1,list2), key=lambda x: x[0])
result_dict = defaultdict(list)
for key, group in groupby(sorted_lists, key=lambda x: x[0]):
result_dict[key].extend(item[1] for item in group)
result_dict = dict(result_dict)
print("The mapped dictionary:",result_dict)
输出
The mapped dictionary: {3: ['apple', 'cherry'], 4: ['banana', 'date'], 5: ['elderberry', 'fig']}
方法六:使用 Collections 模块中的 Counter
使用 Counter,此代码计算 list1 中元素的出现次数;然后它使用 zip 循环遍历 list1 和 list2,这是一种确保每个键(来自 list1 的元素)与值数组(来自 list2 的元素)对齐的方法。精确地,Counter 保持每个可用实例的最新记录:通过这样做,我们避免了结果字典中的重复。
示例
from collections import Counter
list1 = [3, 4, 3, 4, 5, 5]
list2 = ['apple', 'banana', 'cherry', 'date', 'elderberry', 'fig']
result_dict = {}
counter = Counter(list1)
for key, value in zip(list1, list2):
if counter[key] > 0:
if key not in result_dict:
result_dict[key] = []
result_dict[key].append(value)
counter[key] -= 1
print("The mapped dictionary:",result_dict)
输出
The mapped dictionary: {3: ['apple', 'cherry'], 4: ['banana', 'date'], 5: ['elderberry', 'fig']}
方法七:使用 zip 和 itertools.groupby
此方法首先对列表进行排序,然后使用 groupby 对排序后的对进行分组,从而形成一个 result_dict,其中键来自 list 1,值来自 list2。
示例
from itertools import groupby
from operator import itemgetter
list1 = [3, 4, 3, 4, 5, 5]
list2 = ['apple', 'banana', 'cherry', 'date', 'elderberry', 'fig']
sorted_lists = sorted(zip(list1,list2), key=itemgetter(0))
result_dict = {key: [x[1] for x in group] for key, group in groupby(sorted_lists, key=itemgetter(0))}
print("The mapped dictionary:",result_dict)
输出
The mapped dictionary: {3: ['apple', 'cherry'], 4: ['banana', 'date'], 5: ['elderberry', 'fig']}
方法八:使用 for 循环和 setdefault
使用 zip 函数并行迭代两个列表 list1 和 list2,将它们合并在一起。接下来是创建一个字典 result_dict;在这里,它将 list1 中的元素赋值为键,并将 list2 中的元素分组到列表中作为相应的键值。setdefault 方法初始化任何前所未有的字典键,此过程确保 list1 上的值与其在 list2 上的关联值集之间成功映射。
示例
list1 = [3, 4, 3, 4, 5, 3]
list2 = ['apple', 'banana', 'cherry', 'date', 'elderberry', 'fig']
result_dict = {}
for key, value in zip(list1, list2):
result_dict.setdefault(key, []).append(value)
print("The mapped dictionary:",result_dict)
输出
The mapped dictionary: {3: ['apple', 'cherry', 'fig'], 4: ['banana', 'date'], 5: ['elderberry']}
方法九:使用 itertools 的 groupby 函数
此代码合并两个列表:list1 和 list2。最初,它根据 list1 中的元素对它们进行排序;随后,itertools.groupby 发挥作用以对具有相同键的元素进行分组 - 导致一个名为 result_dict 的字典。在此目录中,从 list1 派生的唯一元素作为键,而 List2 中的关联组件用作值。
示例
from itertools import groupby
list1 = [5, 0, 3, 4, 5, 5]
list2 = ['apple', 'banana', 'cherry', 'date', 'elderberry', 'fig']
sorted_lists = sorted(zip(list1, list2), key=lambda x: x[0])
result_dict = {key: [item[1] for item in group] for key, group in groupby(sorted_lists, key=lambda x: x[0])}
print("The mapped dictionary:",result_dict)
输出
The mapped dictionary: {0: ['banana'], 3: ['cherry'], 4: ['date'], 5: ['apple', 'elderberry', 'fig']}
结论
我们展示了创建两个单独列表的映射字典的不同方法。通过建立这些列表中元素之间的关联,这些代码演示了如何有效地管理数据;同时容纳一对一和一对多的关系。每种方法都有其自身的优缺点,但是理解每一种方法可以帮助程序员更好地掌握 Python。
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP