【问题标题】:How to iterate over dict keys when assigning values to multiple variables为多个变量赋值时如何迭代dict键
【发布时间】:2018-09-29 16:46:29
【问题描述】:

我有一个多维字典,主键是散列,子值键入单个字符。我试图通过迭代包含我想要的子键字符的字符串来将值的子集分配给多个变量。比如:

A,B,C = tree[hash][i] for i in "xyz"

这相当于:

A = tree[hash]["x"]
B = tree[hash]["y"]
C = tree[hash]["z"]

但尝试在一行中完成所有操作,可能是嵌入一个函数,我将在其中传递变量列表和相应的子键字符串。

【问题讨论】:

  • 执行以下操作A,B,C = [tree[hash][i] for i in "xyz"]
  • 如果 hash 是变量名,请考虑将其更改为另一个名称,例如 hash_val 或只是一个尾随下划线。
  • 您是否总是有固定数量的接收变量与子键?即 abc 和 xyz 都是 3?
  • 第二个@NChauhan 评论。 hash 是一个内置函数,你的变量名隐藏了它。 hash_ 避免了这种情况,并且在这种情况下经常使用尾随 _。

标签: python dictionary


【解决方案1】:

你几乎做到了。只需在右侧表达式周围添加方括号。它被称为列表理解:

A, B, C = [tree[hash][i] for i in "xyz"]

【讨论】:

  • “由于分数低,我无法发表评论,所以请多多包涵。”:不,不再。反正答案很好,不用道歉。
  • @MichaelB,在 SO 中说“谢谢”的首选方式是投票并接受答案(单击答案附近的复选标记)。您仍未接受此答案。
【解决方案2】:

tree[hash][i] for i in "xyz" 已经是一个生成器推导,但它需要用括号括起来,除非它作为函数的唯一参数传递,如下所示:

my_function(tree[hash][i] for i in "xyz")   # this is valid
my_function(tree[hash][i] for i in "xyz", 12)   # this is invalid, parsing conflict
my_function((tree[hash][i] for i in "xyz"), 12)   # this is valid

这与您的赋值表达式相同。解析时需要括号以避免歧义。

this answer 解决了这个问题,但在生成器理解足够时创建了一个不必要的列表:

A, B, C = (tree[hash][i] for i in "xyz")

解包通过迭代生成器推导来分配左侧变量,而不创建不必要的列表。

也可以避免散列 3 次,使用变量

h = tree[hash]
A, B, C = (h[i] for i in "xyz")

带有mapoperator.itemgetter 的变体以避免循环:

import operator
A,B,C = map(operator.itemgetter(tree[hash]),"xyz")

另外:避免将hash 作为变量名,因为它是散列对象的内置函数。

【讨论】:

  • 很顺利。我应该考虑一下
  • listcomp 或 gencomp,我认为这对 3 个参数没有太大影响。
  • 是的,它没有,但我觉得如果我们不多次迭代列表,那么 gencomp 总是更可取
  • 在其中一个键不存在时发现了问题,因此请改用:A,B,C = (tree[hash].get(i) for i in "xyz")跨度>
  • @angrysmit 有时通过列表理解更好,例如在使用 str.join
猜你喜欢
  • 2013-03-16
  • 1970-01-01
  • 2021-06-13
  • 1970-01-01
  • 1970-01-01
  • 2015-02-28
  • 1970-01-01
  • 2017-02-19
  • 1970-01-01
相关资源
最近更新 更多