假设你有这样的词典
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"
答案 0 :(得分:5)
您可以使用list comprehension或generator 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
此解决方案使用列表理解。
此外,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)