Python 为多个变量赋值时如何迭代dict键

Python 为多个变量赋值时如何迭代dict键,python,dictionary,Python,Dictionary,我有一个多维dict,主键是散列,子值是在单个字符上键入的。我试图通过迭代一个包含我想要的子键的字符的字符串,将值的子集分配给多个变量。比如: A,B,C = tree[hash][i] for i in "xyz" 这相当于: A = tree[hash]["x"] B = tree[hash]["y"] C = tree[hash]["z"] 但是尝试在一行中完成这一切,可能嵌入到一个函数中,在这个函数中我将传递变量列表和相应的子键字符串。您几乎完成了这项工作。只需在右侧表达式周围添加方

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

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"]

“xyz”中i的树[hash][i]已经是生成器的理解,但它需要加括号,除非它作为函数的唯一参数传递,如下所示:

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
这与赋值表达式相同。在解析时,需要使用括号来避免歧义

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

A, B, C = (tree[hash][i] for i in "xyz")
解包通过在生成器上迭代来分配左手变量,而不创建不必要的列表

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

h = tree[hash]
A, B, C = (h[i] for i in "xyz")
带有
map
运算符的变量。itemgetter
以避免循环:

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

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

如果hash是变量名,请执行以下
a、B、C=[tree[hash][i]for i in“xyz”]
,请考虑将它改为另一个名称,例如“代码> HasyVala<代码>,或者只是一个尾随的下划线。您是否总是有固定数量的接收变量与子密钥?i、 e.abc和xyz都是3秒@NChauhan备注。hash是一个内置函数,您的变量名会隐藏它。hash_uu避免了这种情况,在这种情况下经常使用尾随字母“uu”。“我不能评论,因为我的观点很低,所以请容忍我。”:不,不再是了。无论如何,答案是好的,不需要道歉。@MichaelB,在SO中说“谢谢”的首选方式是投票并接受答案(点击答案附近的复选标记)。你仍然不接受这个答案,这很顺利。我应该考虑一下itlistcomp或gencomp,我不认为这对3个参数有太大的影响。是的,它不会,但我觉得如果我们不重复列表一次,gencomp总是更愿意在其中一个键不存在时发现问题,所以改用这个:a,B,C=(tree[hash].get(I)for I in“xyz”)@angrysumit有时传递列表理解更好,例如使用
str.join