如何在python中避免两个循环

时间:2013-01-20 16:55:06

标签: python loops

这是我的问题:我在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 

那么有没有更容易的方法来避免这里的两个循环,或者这是最简单的方法呢?

3 个答案:

答案 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}