如何在Python中用键来初始化一个字典?

932 阅读5分钟

摘要: 最Pythonic的方法是使用dict.fromkeys(key, None) dictionary方法来初始化一个带键的字典,该方法接受给定列表中的每个项目作为一个键,并将None与每个键关联起来作为一个值。


问题的提出。给 出一个包含雇员 ID 的列表,作为其中的项目。你如何用给定列表中的项目(雇员编号)作为键来创建一个只有键的**字典**?

例子。

Given list:  

我们不再耽搁时间,让我们深入探讨解决这个关键问题的众多方法。

方法1:基本方法

方法。使 用for循环,逐一遍历给定列表中的每个元素。在每次迭代中,将None 作为键的值,使键代表给定列表中的每个元素。

代码。

# list of employee IDs --> keys
emp_id = [10946, 20480, 30856]
record = {}
# iterate through list and assign None Values to the keys
for i in emp_id:
    record[i] = None
# display dictionary
print(record)

输出。

{10946: None, 20480: None, 30856: None}

方法2:使用fromkeys的Pythonic解决方案

解决给定问题的最好和最Pythonic的方法是使用字典方法 fromkeys 将列表中的键分配到字典中。

fromkeys() 是一个字典方法,根据指定的键和作为参数在其中传递的值返回一个字典。

语法。 dict.fromkeys(keys, value)
➡ keys 是一个必需的参数,表示一个包含新的 dictionary 的 key 的 iterable。
➡ value 是一个可选的参数,表示新 dictionary 中所有 key 的值。默认情况下,它是 。None

例子。 下面的代码片段揭示了我们如何用一个元组的键来初始化一个 dictionary,并将0 作为每个键的值。

k = ('key_1', 'key_2', 'key_3')
my_dictionary = dict.fromkeys(k, 0)
print(my_dictionary)

# OUTPUT: {'key_1': 0, 'key_2': 0, 'key_3': 0}

解决方案。 现在让我们深入研究给定问题的解决方案,直观地了解如何使用fromkeys() 函数来初始化一个只有键的 dictionary。

# list of employee IDs --> keys
emp_id = [10946, 20480, 30856]
# Using fromkeys
record = dict.fromkeys(emp_id, None)
# display dictionary
print(record)

输出。

{10946: None, 20480: None, 30856: None}

#Note: 即使你没有指定值为None; 默认情况下,它将被视为None

方法3:使用字典的理解力

另一个用键初始化 dictionary 的解决方法是简单地使用 dictionary comprehension。在我们深入研究这个解决方案之前,让我们快速回顾一下什么是字典理解。

字典理解是在一行 Python 代码中创建和初始化字典的一种简明和节省内存的方法。它由两部分组成:表达式和上下文。表达式 定义了如何将键映射到值。上下文 使用单行 for 循环在一个迭代器上循环,并定义哪些 (key, value) 对要包含在新的字典中。

视频教程。

方法。我 们的想法是使用一个 dictionary comprehension,这样表达式就代表了要插入 dictionary 中的 key-value 对。

  • 这里,表达式是key。None,其中key代表给定列表中的每个项目,作为字典的键,而None是与每个键相关的值。
  • 上下文变量key代表给定列表emp_id中的每一项,这样,通过遍历给定列表中的所有元素,就可以获得每一项作为字典的键。

代码。

# list of employee IDs --> keys
emp_id = [10946, 20480, 30856]
# Using fromkeys
record = {key: None for key in emp_id }
# display dictionary
print(record)

输出。

{10946: None, 20480: None, 30856: None}

方法4:使用zip

方法。调zip(emp_id, [None]*len(emp_id)) 方法来创建一个zip对象。这个zip对象将使用下面的迭代表来创建。

  • Iterable 1代表给定的列表emp_id,即。[10946, 20480, 30856]
  • 迭代表2表示一个以None为项目的列表,这样列表中的项目/None值的数量将等于列表的长度,即。 [None, None, None]

因此,当你压缩这两个迭代表时,它将通过合并每个迭代表的第i个来创建一个压缩对象。这意味着给定列表中的每个项目将被映射到第二个迭代器中的 None 值。最后,为了从这个 zip 对象中得到一个字典,你必须使用dict 构造函数把它转换为一个字典。

代码。

# list of employee IDs --> keys
emp_id = [10946, 20480, 30856]
# Using zip
record = dict(zip(emp_id, [None]*len(emp_id)))
# display dictionary
print(record)

输出。

{10946: None, 20480: None, 30856: None}

快速回顾一下zip。 zip() 函数接收任意数量的可迭代数据,并将它们聚合为一个单一的可迭代数据,即zip对象。它将每个迭代器参数的第i个值合并为一个元组。因此,如果你传递两个迭代器,每个元组将包含两个值。如果你传递三个迭代器,每个元组将包含三个值。例如,将列表[1, 2, 3][4, 5, 6] 压缩成[(1,4), (2,5), (3,6)]

结论

好了!我们在这篇文章中发掘了四种在 Python 中初始化只有键的字典的不同方法。总结一下,最Pythonic的方法是使用dict.fromkeys 函数。然而,请随意使用上述任何一种适合你的要求的方法。