用密钥迭代字典的每个元素

时间:2017-11-22 14:36:56

标签: python

假设你有这样的词典

dict_h = {'seven': [8, 9, 10]}

我想像这样迭代它

for key, values in dict_h.items():
    for value in values:
        print('key value', key, value)

有没有办法在一行中做到这一点?我查看了itertools,看看是否有什么东西,但什么都没有。

理想情况类似

for key, value in iter_keyvalue(dict_h):
    print('key value', key, value)

在这两种情况下,我都希望输出为

"key value seven 8"
"key value seven 9"
"key value seven 10"

4 个答案:

答案 0 :(得分:5)

您可以使用list comprehensiongenerator expression组合嵌套循环,例如:

>>> dict_h = {'seven': [8, 9, 10]}
>>> print(*["key value {} {}".format(k, v) for k, values in dict_h.items() for v in values], sep="\n")
key value seven 8
key value seven 9
key value seven 10

那就是说,在必须维护的代码中,你应该真的赞成readability而不是简洁。

答案 1 :(得分:3)

dic_h = {'seven': [8, 9, 10]}

这适用于您的情况:

print('\n'.join(["Key Value {} {}".format(k, v) for k in dic_h for v in dic_h[k]]))

Key Value seven 8
Key Value seven 9
Key Value seven 10

此解决方案使用列表理解。

有关列表理解hereherehere的更多信息。

此外,Google str.join如果您不熟悉的话。

答案 2 :(得分:2)

您可以创建一个执行此操作的生成器表达式:

var connectionStrings = new ConnectionStrings();
var section = Configuration.GetSection("ConnectionStrings").Bind(connectionStrings);

如果您使用此生成器,则有一行:

((key, value) for key, values in dict_h.items() for value in values)

如果您需要多次,您当然可以构建一个函数:

for key, value in ((key, value) for key, values in dict_h.items() for value in values):
    print('key value', key, value)

然后按照您的建议使用它。

请注意,您可以将该函数单独编写为生成器函数:

def iter_keyvalue(d):
    return ((key, value) for key, values in d.iteritems() for value in values)

第一个从生成器表达式创建生成器对象,第二个是"正确的"生成器功能完全相同。

两个版本在功能上都是等效的。唯一可见的区别是生成器对象的def iter_keyvalue(d): for key, values in d.iteritems(): for value in values: yield key, value s,在第一种情况下为__name__,在第二种情况下为'<genexpr>'。在对象的'iter_keyvalue'中也可以看到这种差异。

虽然第二个看起来更干净,但第一个更接近OP只有一条线的请求。

答案 3 :(得分:1)

一行是:

for key, value in ((key, value) for key, values in dict_h.items() for value in values): print('key, value', key, value)