这是我的问题:我在python中有一个dict,如:
a = {1:[2, 3], 2:[1]}
我想输出:
1, 2
1, 3
2, 1
我正在做的是
for i in a:
for j in a[i]:
print i, j
那么有没有更容易的方法来避免这里的两个循环,或者这是最简单的方法呢?
答案 0 :(得分:3)
你拥有的代码就像它获得的一样好。一个小的改进可能是迭代外部循环中的字典项,而不是进行索引:
for i, lst in a.items() # use a.iteritems() in Python 2
for j in lst:
print("{}, {}".format(i, j))
答案 1 :(得分:0)
如果你想避免使用明确的for循环,那么使用列表推导的几个替代方案。
#1方法
# Python2.7
for key, value in a.iteritems(): # Use a.items() for python 3
print "\n".join(["%d, %d" % (key, val) for val in value])
#2方法 - 列表推导的一种更奇特的方式
print "\n".join(["\n".join(["%d, %d" % (key, val) for val in value]) for key, value in a.iteritems()])
两者都会输出
1, 2
1, 3
2, 1
答案 2 :(得分:0)
请记住,在Python中,Readability counts.
,理想情况下@ Blckknght的解决方案就是你应该期待的,但只是看你的问题,技术上作为一个POC,你可以把表达式重写为一个循环,这里是解决方案。
但请注意,如果您愿意,您的代码可以读取,请记住Explicit is better than implicit.
>>> def foo():
return '\n'.join('{},{}'.format(*e) for e in chain(*(izip(cycle([k]),v) for k,v in a.items())))
>>> def bar():
return '\n'.join("{},{}".format(i,j) for i in a for j in a[i])
>>> cProfile.run("foo()")
20 function calls in 0.000 seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.000 0.000 <pyshell#240>:1(foo)
5 0.000 0.000 0.000 0.000 <pyshell#240>:2(<genexpr>)
1 0.000 0.000 0.000 0.000 <string>:1(<module>)
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
10 0.000 0.000 0.000 0.000 {method 'format' of 'str' objects}
1 0.000 0.000 0.000 0.000 {method 'items' of 'dict' objects}
1 0.000 0.000 0.000 0.000 {method 'join' of 'str' objects}
>>> cProfile.run("bar()")
25 function calls in 0.000 seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.000 0.000 <pyshell#242>:1(bar)
11 0.000 0.000 0.000 0.000 <pyshell#242>:2(<genexpr>)
1 0.000 0.000 0.000 0.000 <string>:1(<module>)
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
10 0.000 0.000 0.000 0.000 {method 'format' of 'str' objects}
1 0.000 0.000 0.000 0.000 {method 'join' of 'str' objects}