【问题标题】:Initailizing nested dict with .fromkeys [duplicate]用.fromkeys初始化嵌套字典[重复]
【发布时间】:2023-03-30 17:05:01
【问题描述】:

您好,我想知道在创建嵌套字典时使用 fromkeys 方法创建嵌套字典不起作用。

x=[1,2,3,4,5]
y=[7,8,9,10,11]
zx=dict.fromkeys(x,dict.fromkeys(y,0))

它会创建一个嵌套的字典,但是当你尝试更新它时

zx[1][8]+=1

它更新所有具有键 8 的外键的所有值。

我想知道为什么在使用此函数制作嵌套字典时会发生这种情况

【问题讨论】:

  • 那是因为您将所有键与 same 值相关联。

标签: python dictionary nested


【解决方案1】:

这是因为您将外部字典的 all 键与 same 内部字典相关联。您首先使用dict.fromkeys(y,0) 构建了一个字典,然后将该字典与所有键关联:dict.fromkeys(x,...)

一种构造你想要的字典的方法是例如字典理解

zx = {k: dict.fromkeys(y,0) for k in x}

虽然这看起来完全一样,但实际上并非如此:在这里,我们将 每个 k in x 评估 dict.fromkeys(y,0) 再次。结果,构造的字典将全部等价,但同一个对象。

现在我们得到期望的:

>>> x=[1,2,3,4,5]
>>> y=[7,8,9,10,11]
>>> zx = {k: dict.fromkeys(y,0) for k in x}
>>> zx
{1: {8: 0, 9: 0, 10: 0, 11: 0, 7: 0}, 2: {8: 0, 9: 0, 10: 0, 11: 0, 7: 0}, 3: {8: 0, 9: 0, 10: 0, 11: 0, 7: 0}, 4: {8: 0, 9: 0, 10: 0, 11: 0, 7: 0}, 5: {8: 0, 9: 0, 10: 0, 11: 0, 7: 0}}
>>> zx[1][8]+=1
>>> zx
{1: {8: 1, 9: 0, 10: 0, 11: 0, 7: 0}, 2: {8: 0, 9: 0, 10: 0, 11: 0, 7: 0}, 3: {8: 0, 9: 0, 10: 0, 11: 0, 7: 0}, 4: {8: 0, 9: 0, 10: 0, 11: 0, 7: 0}, 5: {8: 0, 9: 0, 10: 0, 11: 0, 7: 0}}

【讨论】:

  • 你不会得到不可散列的类型列表吗?那么我必须制作列表元组吗?
  • @user6656104:但键不是列表,键是列表的元素。鉴于这些元素是可散列的(如整数、字符串等),那么就没有问题。
猜你喜欢
  • 1970-01-01
  • 2017-11-15
  • 2013-03-27
  • 2018-07-14
  • 1970-01-01
  • 1970-01-01
  • 2018-05-02
  • 2016-06-04
  • 2018-10-22
相关资源
最近更新 更多