将值分配给多个变量时如何遍历dict键

时间:2018-09-29 16:46:30

标签: python dictionary

我有一个多维字典,主键是一个散列,子值以单个字符为键。我试图通过遍历包含所需子键字符的字符串,将值的子集分配给多个变量。像这样:

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

这等于:

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

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

2 个答案:

答案 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")

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

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

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