跳到主要内容

Python 字典 fromkeys() 方法

fromkeys() 方法根据给定的键和值序列创建一个字典。

示例

# 字典的键
alphabets = {'a', 'b', 'c'}

# 字典的值
number = 1

# 创建带有键和值的字典
dictionary = dict.fromkeys(alphabets, number)

print(dictionary)

# 输出: {'a': 1, 'c': 1, 'b': 1}

fromkeys() 语法

fromkeys() 方法的语法是:

dict.fromkeys(alphabets, number)

这里,alphabets 和 number 是字典的键和值。

fromkeys() 参数

fromkeys() 方法可以接受两个参数:

  • alphabets - 可以是任何可迭代的对象,如字符串、集合、列表等,作为键。
  • numbers(可选)- 可以是任何类型或任何可迭代的对象,如字符串、集合、列表等,作为值。

注意: 字典的所有键都被分配相同的值。

fromkeys() 返回值

fromkeys() 方法返回:

  • 一个带有给定键和值序列的新字典

注意: 如果没有提供字典的值,键将被分配 None

示例 1:带有键和值的 Python 字典 fromkeys()

# 元音的集合
keys = {'a', 'e', 'i', 'o', 'u' }

# 为值分配字符串
value = 'vowel'

# 创建带有键和值的字典
vowels = dict.fromkeys(keys, value)

print(vowels)

输出

{'a': 'vowel', 'u': 'vowel', 'e': 'vowel', 'i': 'vowel', 'o': 'vowel'}

在上述示例中,我们使用了 fromkeys() 方法来创建一个带有给定键集合和字符串值的字典。

这里,fromkeys() 方法从键和值创建了一个名为 vowels 的新字典。字典的所有键被分配相同的值。

示例 2:没有值的 fromkeys()

# 数字列表
keys = [1, 2, 4 ]

# 仅创建带有键的字典
numbers = dict.fromkeys(keys)

print(numbers)

输出

{1: None, 2: None, 4: None}

在上述示例中,我们使用给定的键列表创建了一个名为 numbers 的字典。

我们没有提供任何值,因此所有键默认被分配了 None

示例 3:使用 fromkeys() 从可变对象创建字典

# 元音的集合
keys = {'a', 'e', 'i', 'o', 'u' }

# 数字列表
value = [1]

vowels = dict.fromkeys(keys, value)
print(vowels)

# 更新列表值
value.append(2)

print(vowels)

输出

{'a': [1], 'u': [1], 'o': [1], 'e': [1], 'i': [1]}
{'a': [1, 2], 'u': [1, 2], 'o': [1, 2], 'e': [1, 2], 'i': [1, 2]}

在上述示例中,我们使用列表作为字典的值。像列表、字典等可迭代对象是可变对象,意味着它们可以被修改。

这里,当我们使用 append 更新列表值时,键被分配了新的更新值。这是因为每个元素指向内存中的同一个地址。

为了解决这个问题,我们可以使用字典推导。

可变对象的字典推导

我们可以使用字典推导并在更新可变对象(列表、字典等)时防止更新字典。例如,

# 元音键
keys = {'a', 'e', 'i', 'o', 'u' }
value = [1]

# 使用字典推导创建字典
vowels = { key : list(value) for key in keys }

print(vowels)

# 更新值列表
value.append(2)

print(vowels)

输出

{'a': [1], 'u': [1], 'o': [1], 'e': [1], 'i': [1]}
{'a': [1], 'u': [1], 'o': [1], 'e': [1], 'i': [1]}

在上述示例中,我们使用了字典推导来创建一个名为 vowels 的字典。

这里,值没有被分配给字典的键。但是,对于 keys 中的每个键,都创建了一个新的 value 列表。这个新创建的列表被分配给字典中的每个键。

推荐阅读: Python 字典推导