我有一个多维字典,主键是一个散列,子值以单个字符为键。我试图通过遍历包含所需子键字符的字符串,将值的子集分配给多个变量。像这样:
A,B,C = tree[hash][i] for i in "xyz"
这等于:
A = tree[hash]["x"]
B = tree[hash]["y"]
C = tree[hash]["z"]
但是尝试在一行中完成所有操作,可能会嵌入到我将传递vars列表和相应的子键字符串的函数中。
答案 0 :(得分:5)
您几乎做到了。只需在右侧表达式周围添加方括号即可。这就是列表理解:
A, B, C = [tree[hash][i] for i in "xyz"]
答案 1 :(得分:3)
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")
带有map
和operator.itemgetter
的变量以避免循环:
import operator
A,B,C = map(operator.itemgetter(tree[hash]),"xyz")
此外:避免使用hash
作为变量名,因为它是散列对象的内置函数。